尝试从C#中的键值对创建DataGridView

时间:2010-07-01 17:05:58

标签: c# xml winforms datagridview linq-to-xml

在Windows窗体应用程序中,我正在尝试创建一个包含两列的DataGridView:一列用于XML元素给出的键,另一列用于所述XML元素的值。到目前为止,这是我的代码:

        this.myData = new DataGridView();
        ((System.ComponentModel.ISupportInitialize)(myData)).BeginInit();

        myData.Location = new System.Drawing.Point(12, 42);
        myData.Name = "myData";
        myData.Size = new System.Drawing.Size(1060, 585);
        myData.TabIndex = 32;

        foreach (XElement xElem in xInfoItems)
        {
            numItems++;
        }

        myData.Columns.Add(new DataGridViewTextBoxColumn());
        myData.Columns.Add(new DataGridViewTextBoxColumn());
        myData.Columns[0].Name = "Key";
        myData.Columns[0].DataPropertyName = "key";
        myData.Columns[1].Name = "Value";
        myData.Columns[1].DataPropertyName = "value";

        List<myRow> data = new List<myRow>();


        foreach (XElement xElem in xInfoItems)
        {
            data.Add(new myRow(xElem.Attribute("key").Value, xElem.Value));
        }

        myData.DataSource = data;

        myData.Refresh();

        this.PerformLayout();

我已确认data中的所有信息都是通过foreach加载的,因此该部分正在运行。我的问题是网格显示,但网格上没有显示任何内容。我究竟做错了什么?我对这种数据类型不是很了解所以我很抱歉这是显而易见的。

更新

我发现我没有在Design视图中正确设置myData。添加myRow类后,它运行得很好。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

问题可能在于myRow类。当我试图重现你的代码时,我首先将“key”和“value”定义为myRow类的公共字段,如下所示:

public class myRow {
  public string key;
  public string value;

  public myRow( string Key, string Value )
  {
     key = Key;
     value = Value;
  }

}

这会导致绑定行显示但文本不在单元格中。当我将它们都更改为属性时,绑定效果更好:

public class myRow{
  private string _key;
  public string key
  {
     get
     {
        return _key;
     }
  }

  private string _value;
  public string value
  {
     get
     {
        return _value;
     }
  }

  public myRow( string Key, string Value )
  {
     _key = Key;
     _value = Value;
  }

}

答案 1 :(得分:1)

我对您的代码所做的修改可能会有所帮助。 (我只关注创建列的部分并使用DataTable添加行。)

this.myData = new DataGridView();
((System.ComponentModel.ISupportInitialize)(myData)).BeginInit();

myData.Location = new System.Drawing.Point(12, 42);
myData.Name = "myData";
myData.Size = new System.Drawing.Size(1060, 585);
myData.TabIndex = 32;

foreach (XElement xElem in xInfoItems)
{
    numItems++;
}


// Here we create a DataTable with two columns.
DataTable table = new DataTable();
table.Columns.Add("Key", typeof(string));
table.Columns.Add("Value", typeof(string));

foreach (XElement xElem in xInfoItems)
{
     //Here we add rows to table
     table.Rows.Add(xElem.Attribute("key").Value, xElem.Value);
}

myData.DataSource = table;

myData.Refresh();

this.PerformLayout();