【问题标题】:Fill the DatagridView with empty rows用空行填充 DatagridView
【发布时间】:2012-10-10 21:27:38
【问题描述】:

我的 Windows 窗体中有一个 datagridview。那是根据组合框中的选定值从数据库中填充数据。对于某些选定的项目,数据库中有记录。有些人没有记录。那时我需要维护一个固定大小的datagridview,其中没有填充任何记录。有没有办法做到这一点。如果是,请帮助我...

【问题讨论】:

  • 你将什么绑定到 DataGridView?如果您使用的是 DataTable,您是否尝试过向 DataTable 添加空行?
  • 如果我使用空行,那么在处理空单元格时应该会出现问题。我将单元格点击事件用于其他目的。

标签: c# winforms datagridview


【解决方案1】:

如果您的数据源与此类似:

    public class MyDataSource : IEnumerable<SomeClass>
    {}

-你可以这样做:

    public IEnumerator<SomeClass> GetEnumerator()
    {
        if (sourceItems == null)
        {
            yield return SomeClass.Empty;
            //as many times as you want "empty" lines in datagrid
        }
        else
        {
            foreach (var item in sourceItems)
               yield return item;
        }
    }

“sourceItems”是“SomeClass”类型项目的内部列表。 有很多方法可以做到这一点,这只是其中之一。

你今天要做的是从数据库中加载数据并将结果直接写入datagridview。我的建议是从数据库加载数据(就像现在一样),而不是将数据写入数据网格,而是创建一个类来保存项目(数据源类)。然后将该类提供给类似于以下的数据网格:

MyDataSource ds = new MyDataSource();
GetDataFromDatabase().Select(p=>ds.Add(p));
BindingSource bs = new BindingSource(ds, ");
theDataGrid.DataSource = bs;

然后使用 BindingSource 来控制内容(只是为了展示一些你可能会做的事情):

 bs.AllowNew = false;
 bs.Position = bs.Count - 1;
 bs.ListChanged += new ListChangedEventHandler(bindingSource_ListChanged);
 bs.CurrentItemChanged += new EventHandler(bindingSource_CurrentItemChanged);

【讨论】:

  • 我的数据源不是这样的。它通过调用一些存储过程从数据库中获取。
  • 为什么不将其更改为使用 BindingSource (new BindingSource(source, "");" 它会变得容易得多...
  • 尝试创建一个小的概念验证,在其中添加一个 datagridview 和一个 List,在列表中填充一些项目并将其提供给 datagridview 属性 DataSource,看看会发生什么。这基本上就是数据源的意义所在。之后,尝试添加更多,如我上面的示例所示。
猜你喜欢
  • 2015-11-27
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2021-01-04
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多