У меня есть объект 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 Благодарения и *