DataGridView使用List <object>“丢失”列

时间:2015-07-24 09:31:13

标签: c# winforms datagridview

我有一个List ComparisonItem,我想在datagridview dataGridViewCompare中显示它。 ComparisonItem的一些属性也是列表,dataGridViewCompare不会显示这些列。

实际上我不想在单元格中显示列表,但是当用户选择特定行时,我想在文本框中显示该单元格的内容。

public class ComparedItem
{
    public ElementItem SourceElement { get; private set; }
    public ElementItem TargetElement { get; private set; }
    public bool HasErrors { get; set; }
    public List<ErrorType> ErrorTypes { get; set; }
    public string FriendlyErrorNames { get; set; }
    public List<string> DetailsInconsistencyError { get; set; }
    public string DetailsSpecialCharsError { get; set; }
    public string DetailsTextError { get; set; }

    public ComparedItem(ElementItem source, ElementItem target)
    {
        SourceElement = source;
        TargetElement = target;
        DetailsInconsistencyError = new List<string>();
        DetailsInconsistencyError.Add("Test"); // <- Temp
        ErrorTypes = new List<ErrorType>();
        FriendlyErrorNames = String.Empty;
    }
}

以我的主要形式:

List<ComparedItem> = new List<ComparedItem> comparedItems;
// fill list in some other code...
dataGridViewCompare.DataSource = comparedItems;

dataGridViewCompare显示我期望的所有行,但只显示列

  • SourceElement
  • TargetElement
  • HasErrors
  • FriendlyErrorNames
  • DetailsS​​pecialCharsError
  • DetailsTextError

显示。

  • ErrorTypes和
  • DetailsInconsistencyError

迷路了。

是否无法在datagridview单元格中保存列表?

1 个答案:

答案 0 :(得分:2)

我不认为您可以在DGV单元格中显示List<T>

但它位于DataSource,因此您可以根据需要提取值并在TextBoxes中显示。

以下是如何访问列表中的(第一个选定的)行绑定到的项目:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.SelectedRows.Count <= 0) return;
    ComparedItem ci = (dataGridView1.SelectedRows[0].DataBoundItem as ComparedItem);

    if (ci != null) 
    {
      textBox1.Text = someStringRepresentation(ci.ErrorTypes);
      textBox2.Text = someStringRepresentation(ci.DetailsInconsistencyError);
    }
}

根据SelectionMode,您可能希望在CurrentCellChanged事件等中添加类似的代码。