繁体   English   中英

DataGridView行显示但没有数据

[英]DataGridView rows show up but no data

我正在尝试将集合(从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()来填充这些网格。 现在有什么想法吗?

当您将对象数据绑定到某个控件时,数据绑定接口将自动在对象上调用“ 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();
    }
}

在上面的代码段中,我们在执行逻辑之前检查特定的列,但这是可选的,您自己的情况可能有所不同。 需要注意的主要点是,我们将原始对象传递给了事件args,而我们要做的就是将格式化后的值设置回事件args中。 在这种情况下,通过在基础对象上调用“ ToString()”来生成格式化值。 现在,在DataGridView中,您将在适当的单元格中看到此格式化的值。

希望能有所帮助。

您需要将AllowUserToAddRows设置为false;

暂无
暂无

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

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