繁体   English   中英

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

[英]Trying to set a maximum row count with a data-bound 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,从而创建了绑定源),该DGV创建了一种显示对象的方法,例如按下按钮即可:

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

private void showObjects()
    {

       objectStorageBindingSource.DataSource = null;

       objectStorageBindingSource.DataSource = objectStorage.objArray; 
    }

这完全可以,但是显然行数没有限制,由于数据绑定问题,我不能这样做。

警告

从长远来看,这不是您应该采用的方法,但是鉴于问题完全针对您的方法并且缺少一些周围的细节(这最终意味着问题将被解决),因此我提供此作为实用的答案。

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

请记住以上内容,作为答案的其余部分。


在源头限制行

在我们的注释中进行进一步讨论之后,在不了解代码当前外观的情况下,我将建议一些简单的方法。

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”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM