2009-11-05 69 views
1

我想绑定一个集合(从BindingList继承)到DataGridView。网格标题显示正常,我得到了我期望的行数。但是,这些单元格是空的。有没有其他人有这个问题?如果是这样,你是如何解决它的?我曾与其他有同样问题的人谈过,但他们不记得他们是如何解决这个问题的。我试图创建一个简单的版本来显示问题,但没有任何运气。所以我很抱歉,我没有包含任何代码。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)的所有公共属性都是接口类型。我添加了一个字符串属性,其数据奇迹般地显示出来。所以,在上面的例子中,Text列的数据会显示出来。但是LineNumber列的数据不会因为它是一个接口类型(ILineNum)。我想ToString()将被调用来填充这些网格。现在有什么想法?

+0

你能举出更多你试图绑定的对象的例子吗?例如,“从BindingList继承的集合”是什么样的?你如何将你的对象绑定到DataGridView?直接或通过BindingSource?你确定你的对象有数据吗? 这是很难回答,没有代码分析。 :) – 2009-11-05 20:17:23

+0

我做了一些编辑以包含代码的外壳。我不确定这会有多大帮助。我已经验证调试器中有数据。 – bsh152s 2009-11-05 21:08:06

回答

1

当您将某个对象绑定到某个控件时,数据绑定接口将自动在您的对象上调用“ToString()”,以便在您绑定的任何控件中获得体面的字符串表示。在DataGridView的情况下,您将在合适的单元格中看到底层对象的ToString'd表示形式。但是,当您绑定到接口时,不会对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(); 
    } 
} 

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

希望有所帮助。

0

您需要将AllowUserToAddRows设置为false;