我正在尝试将一个集合(继承自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)的所有公共属性也是接口类型。我添加了一个字符串属性,它的数据神奇地显示出来。因此,在上面的示例中,将显示Text列的数据。但是,LineNumber列的数据不会,因为它是接口类型(ILineNum)。我想要调用ToString()来填充这些网格。现在有什么想法吗?
答案 0 :(得分: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();
}
}
在上面的代码片段中,我们在执行逻辑之前检查特定列,但这是可选的,您自己的场景可能会有所不同。要注意的要点是我们获取在事件args上传入的原始对象,我们需要做的就是在事件args中设置格式化的值。在这种情况下,通过在底层对象上调用“ToString()”生成格式化的值。在DataGridView中,您现在将在相应的单元格中看到此格式化的值。
希望有所帮助。
答案 1 :(得分:0)
您需要将AllowUserToAddRows
设置为false;