bugfix> c# > 投稿

私は Dictionary<string, string> を持っていますobejct。そのデータは、 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[] 配列が正しく入力されている、 ResizeListView(int _rows) メソッドは、リストの高さ、 ListView 列ヘッダーは正しく表示されますが、残りは単なる空白行です。

フォローしましたこれらの指示 MSDNで、しかし、私は本当に私が不足しているものを見つけることができません。

どんなアドバイスも大歓迎です。

ありがとう

回答 1 件
  • 列ごとに1つのListViewItemと行ごとに1つのSubItemを追加しているようです。それは逆になります。

    最初の列は、ListViewItem Textプロパティから入力されます。 2番目からn番目の列には、 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()
        );
    }
    
    

あなたの答え