代码之家  ›  专栏  ›  技术社区  ›  Davide Vitali

填充后的ListView为空

  •  0
  • Davide Vitali  · 技术社区  · 6 年前

    我有一个 Dictionary<string, string> obejct,其数据应通过在 TextBox 控件,然后以 ListView 控制

    我想出的解决方案是:

    • 转换 字典<弦,弦> DataTable

    • 使用文本框的 TextChanged 事件来触发过滤器

    • 将过滤后的记录放入 DataRow[] 数组,将所述数组作为参数传递给自定义方法以填充 列表视图 对象

    下面是我如何转换字典的:

    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) 方法的作用是调整列表的高度 列表视图 正确显示列标题,但其余的只是空行。

    我跟着 these instructions 在MSDN上,但我真的找不到我缺少的东西。

    任何建议都将不胜感激。

    谢谢-

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Wu    6 年前

    看起来您要为每列添加一个ListViewItem,并为每行添加一个子项。反过来说。

    第一列由ListViewItem填充 Text 所有物第二到第n列由提供给的字符串填充 SubItems.Add() .

    以上假设您正在使用详细信息 View 模式,这是唯一允许多列的视图。

    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()
        );
    }