none
请教DaataGridView数据绑定的问题 RRS feed

  • 问题

  • 假设Form中的有一个ComboBox(cmbName)和DataGridView(dgv),
    首先通过API从某个应用软件(不是直接存取数据库)中获取数据,填充在DataGridView中,
    然后用户在DataGridView编辑(新增、删除行或编辑单元格),
    最后将DataGridView中编辑后的数据保存到应用软件中。

    我按以下的方法进行绑定,程序运行良好。
    DataGridView的变化能反映在BindingList中,反之,BindingList的变化也能反映在DataGridView中

    private BindingList<Hole> bindingListHoles;
    
    private void Update()
    {
    	var list = new List<Hole>();
    	for (int i = 0; i < 10; i++)
    	{
    		Hole Hole = new Hole();
    		hole.Index=i;
    		hole.Name="H"+i;
    		list.Add(hole);
    	}
    	bindingListHoles = new BindingList<Hole>(list);
    	dgv.DataSource = bindingListHoles;
    }

    但如果使用combobox时进行筛选,下面代码导致dgv中无任何内容。请问如何修改?
    而且如果按Name进行筛选,无论是列出全部或部分数据,希望BindingList是一个完整的集合而不是DataGridView中过滤后的一部分。这样应该如何做?

    private void cmbName_SelectedIndexChanged(object sender, EventArgs e)
    {
    	string cmbName = cmbName.Text.Trim();
    	if (cmbName == "All" || cmbName == string.Empty)
    	{
    		dgv.DataSource = bindingListHoles.OrderBy(h => h.Index);
    	}
    	else
    	{
    		var query = bindingListHoles.Where(h => h.Name == cmbName).OrderBy(h => h.Index);
    		dgv.DataSource = query;
    	}
    }

    2019年10月16日 13:17

答案

  • hi Kyle,感谢你的回复。

    我之前也是这么写的,但没有用。

    现在我将要过滤的行在dgv 隐藏,这样比较完善的解决了我的问题

    >> 希望BindingList是一个完整的集合而不是DataGridView中过滤后的一部分

    这个是因为我不确定是否过滤后集合的东西变少了。我希望无论如何过虑,BindingList始终是完整的。因为过滤后dgv可能只显示一部分。

    在使用Where语句过滤后,bindingListHoles中的项并不会发生改变,它只会将过滤后的结果存储到新的变量query中。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 leon1526 2019年10月21日 14:13
    2019年10月18日 1:17
    版主

全部回复

  • Hi Leon1526,

    首先在“cmbName_SelectedIndexChanged”中, 字符串cmbName好像与你的ConboBox控件重名了。

    至于你说的dgv中无任何内容,那是因为你并没有将List绑定到上面,修改代码如下。

        string cname = cmbName.Text.Trim();
        if (cname == "All" || cname == string.Empty)
        {
            dgv.DataSource = bindingListHoles.OrderBy(h => h.Index).ToList();
        }
        else
        {
            var query = bindingListHoles.Where(h => h.Name == cname).OrderBy(h => h.Index).ToList();
            dgv.DataSource = query;
        }

    >> 希望BindingList是一个完整的集合而不是DataGridView中过滤后的一部分

    至于这句话,我不太明白它的含义,你能稍微解释一下吗?

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年10月17日 1:46
    版主
  • hi Kyle,感谢你的回复。

    我之前也是这么写的,但没有用。

    现在我将要过滤的行在dgv 隐藏,这样比较完善的解决了我的问题

    >> 希望BindingList是一个完整的集合而不是DataGridView中过滤后的一部分

    这个是因为我不确定是否过滤后集合的东西变少了。我希望无论如何过虑,BindingList始终是完整的。因为过滤后dgv可能只显示一部分。

    2019年10月17日 15:39
  • hi Kyle,感谢你的回复。

    我之前也是这么写的,但没有用。

    现在我将要过滤的行在dgv 隐藏,这样比较完善的解决了我的问题

    >> 希望BindingList是一个完整的集合而不是DataGridView中过滤后的一部分

    这个是因为我不确定是否过滤后集合的东西变少了。我希望无论如何过虑,BindingList始终是完整的。因为过滤后dgv可能只显示一部分。

    在使用Where语句过滤后,bindingListHoles中的项并不会发生改变,它只会将过滤后的结果存储到新的变量query中。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 leon1526 2019年10月21日 14:13
    2019年10月18日 1:17
    版主