【问题标题】:DataGridView rows show up but no dataDataGridView 行显示但没有数据
【发布时间】:2009-11-05 19:58:21
【问题描述】:

我正在尝试将集合(从 BindingList 继承)绑定到 DataGridView。网格标题显示得很好,我得到了我期望的行数。但是,单元格是空的。有没有其他人有这个问题?如果是这样,您是如何解决的?我和其他有同样问题的人谈过,但他们不记得他们是如何解决的。我试图创建一个显示问题但没有任何运气的简单版本。所以很抱歉,我没有包含任何代码。

编辑#1:

我认为这段代码不会有帮助,但以防万一。我已经简化了一些事情,以防止不得不勾勒出我们代码的 47 层。但就像我说的,我不能用这样一个非常简单的例子来重现问题。我并不是真的想要代码分析——只是那些遇到这个问题的人的智慧之言。当然,我不是唯一一个。

public interface ISearchResultCollection : IList<ISearchResult>
{
...
}

public class SearchResultCollection : BindingList<ISearchResult>, ISearchResultCollection
{
...
}

public interface ISearchResult
{
  ILineNum LineNumber {get; set;}
  string Text {get; set;}
}

public class SearchResult
{
...
}

ISearchResultCollection results = objectToSearch.Find("searchstring");
dataGridView1.DataSource = results;

编辑#2:

我想我已经领先了。我的接口上所有代表项目 (ISearchResult) 的公共属性也是接口类型。我添加了一个字符串属性,它的数据神奇地出现了。因此,在上面的示例中,文本列的数据将显示出来。但是,LineNumber 列的数据不会,因为它是接口类型 (ILineNum)。我想 ToString() 将被调用来填充这些网格。现在有什么想法吗?

【问题讨论】:

  • 您能否提供更多您尝试绑定的对象的示例?例如,“从 BindingList 继承的集合”是什么样的?您如何将对象绑定到 DataGridView?直接还是通过 BindingSource?你确定你的对象里面有数据吗?如果没有代码进行分析,这很难回答。 :)
  • 我做了一些编辑以包含代码的外壳。我不确定它会有多大帮助。我已验证调试器中有数据。

标签: c# collections binding


【解决方案1】:

当您将对象数据绑定到某个控件时,数据绑定接口将自动在您的对象上调用“ToString()”,这样您就可以在绑定到的任何控件中获得体面的字符串表示。在 DataGridView 的情况下,您将在适当的单元格中看到底层对象的 ToString 表示。但是,当您将数据绑定到接口时,不会对 ToString() 进行此类调用。这意味着您的 DataGridView 将显示一个空单元格,但这很容易引起误解,因为绑定的对象实际上是应该存在的 - 它只是没有任何值可以显示在单元格中。

要解决此问题,您需要自己处理显示值的格式。在 DataGridView 中,这可以通过处理 CellFormatting 事件来实现。每当任何单元格需要格式化其值时都会触发此事件,因此您必须注意不要在此处理程序中放置太多繁重的逻辑。在您的情况下,您需要做的就是在底层对象上调用“ToString()”。所以你可以处理 CellFormatting 事件,然后在你的处理程序中使用这样的东西:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.Value != null && dataGridView1.Columns[e.ColumnIndex] == theRelevantColumn)
    {
        e.Value = e.Value.ToString();
    }
}

在上面的 sn-p 中,我们在执行逻辑之前检查特定列,但这是可选的,您自己的情况可能会有所不同。需要注意的主要一点是,我们在事件 args 中获得了传入的原始对象,我们需要做的就是在事件 args 中设置格式化的值。在这种情况下,格式化值是通过在底层对象上调用“ToString()”来生成的。在您的 DataGridView 中,您现在将在相应的单元格中看到此格式化值。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您需要将AllowUserToAddRows设置为false;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2011-07-31
      • 2016-10-12
      相关资源
      最近更新 更多