尝试使用数据绑定DataGridView设置最大行数

时间:2015-04-16 09:44:09

标签: c# winforms datagridview

我的应用程序中有一个DataGridView,但是我想将它限制为只有20行,但是因为它是数据绑定的,所以我得到了InvalidOperationException。通过研究我遇到了虚拟模式,但对于像我这样的初学者来说,这看起来令人难以置信。此外,我看到有人说设置DGV.DataSource = null;来解决问题,但这对我没有用。

我基本上,单击一个按钮,然后DataGridView填充信息。我所做的唯一工作是限制用户只输入我的对象的20个实例。然后他们必须删除一个才能进入另一个。

有什么办法可以用数据绑定的DataGridView设置最大行限制吗?

修改

在我单独的类文件(objectStorage.cs)中,我有这个

public class objectStorage: IComparable<objectStorage>
{
    public string objID { get; set; }
    public string objName { get; set; }
    public string objDescription { get; set; }


    public static List<objectStorage> objArray = new List<objectStorage>();
}

然后在我添加新对象(addObj.cs)的表单中,我有这个:

private void objCreationBtn_Click(object sender, EventArgs e)
    {
         objectStorage.objArray.Add(new objectStorage
         {
            objID = objIDValueTxt.Text,
            objName = objNameRTB.Text,
            objDescription = objDescRTB.Text,
         });

    }

然后在我的主要表单中,我有DGV(我在GUI中将数据源分配给objectStorage,从而创建了一个绑定源),我创建了一个方法来显示对象,如下按钮按下:

private void displayObjBtn_Click(object sender, EventArgs e)
{
        showObjects();
}

private void showObjects()
    {

       objectStorageBindingSource.DataSource = null;

       objectStorageBindingSource.DataSource = objectStorage.objArray; 
    }

这完全没问题,但显然不包括对行数的限制,由于数据绑定问题我无法做到这一点。

1 个答案:

答案 0 :(得分:0)

<强>买者

从长远来看,这不是你应该采取的方法,但我认为这是一个实用的答案,因为这个问题对你的方法非常具体,缺乏一些周围的细节(这最终将意味着问题将是闭)。

它还假设“虚拟模式”操作不是您所追求的(根据链接的重复问题,它提供了答案)。

请在回答的其余部分前面考虑上述内容。

<小时/> 限制来源的行

除了我们在评论中的讨论,并且没有看到代码目前的样子,我会建议一些简单明了的事情。

DataGridView将位于Form,其中将包含代码隐藏文件。在此文件中,我们希望进行必要的修改以将列表限制为20个项目:

using System.Linq;
using System.Collections.Generic;

public class MyForm : Form
{
    // Event handler for the Forms Load event
    public void MyForm_OnLoad(object sender, EventArgs e)
    {
        // Take 20 items from whatever source you are currently using in the DGV.
        List<MyDataBoundItem> items = objectStorage.Items.Take(20).ToList();

        dataGridView1.DataSource = items;
    }
}

并不总是需要绑定列表,可以使用List<T>,但我认为它是只读的,而BindingList<T>支持添加和删除行。

还要记住删除设计者主导的解决方案,因为它们会相互干扰。

如果内存服务,DataGridView控件不提供强制最大行的机制。假设网格允许添加行,则必须处理用户尝试添加新行并且最大的情况。其他用户输入方案可能需要手动干预。


关于模式的简要说明

至于简要提及“视图模型”,暂时忽略这一点。它是从一些标准UI模式中的一个借用的术语,用于将UI处理分成可测试的块。当您经历一些非图案化UI编码的痛苦时,您应该阅读这个更高级的主题: - )

为了将来的选择,请搜索“MVC”,“MVP”和“MVVM”。