Пустое ListView после заполнения - PullRequest
0 голосов
/ 25 мая 2018

У меня есть объект Dictionary<string, string>, данные которого должны фильтроваться в режиме реального времени по тексту, представленному в элементе управления TextBox, а затем отображаться в элементе управления ListView.

Решение, которое я нашелс был:

  • преобразование Dictionary<string, string> в DataTable

  • с использованием события TextChanged текстового поля для запуска фильтра

  • помещает отфильтрованные записи в массив DataRow[], передавая указанный массив в качестве аргумента пользовательскому методу для заполнения ListView объекта

Теперьвот как я преобразую словарь:

static DataTable dtDepartments { get; set; }
static Dictionary<string, string> GetDepartments(string _depNum, out bool _isOff) 
 {
     // retrieve the list from a SQL Server DB
 }

public myForm()
{
    InitializeComponent();

    Dictionary<string, string> Departments = new Dictionary<string, string>();
    Departments = GetDepartments(string.Empty, out bool _isOff);

    dtDepartments = new DataTable();
    dtDepartments.TableName = "DEPARTMENTS";
    DataColumn idColumn = dtDepartments.Columns.Add("NUM", typeof(string));
    dtDepartments.Columns.Add("NAME", typeof(string));
    dtDepartments.PrimaryKey = new DataColumn[] { idColumn };

    foreach(KeyValuePair<string,string> kvP in Departments)
    {
        dtDepartments.Rows.Add(new object[] { kvP.Key, kvP.Value });
    }
}

и вот как я заполняю список в методе события

private void txtFilter_TextChanged(object sender, EventArgs e)
{
    string filter = "NAME LIKE '%" + txtFilter.Text + "%'";
    DataRow[] foundRows = dtDepartments.Select(filter);

    if (foundRows.Length > 0)
    {
        lvDepartments.Visible = true;
        ResizeListView(foundRows.Length);
        PopulateListView(foundRows);
    }
}

void ResizeListView(int _rows)
{
    lvDepartments.Height = Math.Min(25 + (20 * _rows), 205);
}

void PopulateListView(DataRow[] _foundRows)
{
    lvDepartments.Items.Clear();
    ListViewItem depNum = new ListViewItem("NUM", 0);
    ListViewItem depName = new ListViewItem("NAME", 0);
    foreach (DataRow row in _foundRows)
    {
        depNum.SubItems.Add(row.Field<string>("NUM"));
        depName.SubItems.Add(row.Field<string>("NAME"));
    }

    lvDepartments.Columns.Add("Number", -2, HorizontalAlignment.Left);
    lvDepartments.Columns.Add("Name", -2, HorizontalAlignment.Left);

    lvDepartments.Items.AddRange(new ListViewItem[] { depNum, depName });
}

Правильно заполнен массив DataRow[], *Метод 1034 * выполняет свою работу по адаптации высоты списка, ListView корректно отображает заголовок столбцов, а остальные - просто пустые строки.

Я следовал этим инструкциям в MSDN, но я не могу найти то, что мне не хватает.

Любой совет очень ценится.

* 1044 Благодарения и *

1 Ответ

0 голосов
/ 25 мая 2018

Похоже, вы добавляете один ListViewItem на столбец и один SubItem на строку.Все идет наоборот.

Первый столбец заполняется из свойства ListViewItem Text .Второй, четвертый столбцы заполняются из строк, переданных в SubItems.Add().

. Выше предполагается, что вы используете режим подробностей Представление , которое является единственным представлением, допускающим несколько столбцов.

void PopulateListView(DataRow[] _foundRows)
{
    lvDepartments.Items.Clear();
    foreach (var row in _foundRows)
    {
        var item = new ListViewItem { Text = row.Field<String>("NUM") };
        item.SubItems.Add( row.Field<String>("NAM") );
        lvDepartments.Items.Add( item );
    }
}

Или, если вы LINQ-y

void PopulateListView(DataRow[] _foundRows)
{
    lvDepartments.Items.Clear();
    lvDepartments.Items.AddRange
    (
        _foundRows.Cast<DataRow>().Select
        ( 
            row =>
            {
                var item = new ListViewItem
                {
                    Text = row.Field<string>("NUM")
                };
                item.SubItems.Add( row.Field<string>("NAME") );
                return item;
            }
        )
        .ToArray()
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...