DataGridViewColumn.DataPropertyName属性

时间:2010-02-08 11:27:02

标签: winforms datagridview datasource

我有一个DataGridView控件,我想用数据填充它。

我使用DataSource属性

// dgvDealAsset is DataGridView
        private void DealAssetListControl_Load(object sender, EventArgs e)
        {
            dgvDealAssets.AutoGenerateColumns = false;
            dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList();
}

现在问题第一。我的集合的类不仅包含我可以使用DataPropertyName映射到列的简单类型。这是集合中包含的类。

class MyClass
{
  public String Name;
  MyOtherClass otherclass;
}

class MyOtherClass
{
 public String Name;
}

现在我将MyClass的属性绑定到列

col1.DataPropertyName = "Name"  // Ok 
col2.DataPropertyName = "otherclass" // Not OK - I will have empty cell

问题是我想显示otherclass.Name字段。但如果我试着写

col2.DataPropertyName = "otherclass.Name" 

我得到空单元格。

我尝试手动设置列

private void DealAssetListControl_Load(object sender, EventArgs e)
{
    dgvDealAssets.AutoGenerateColumns = false;
    dgvDealAssets.DataSource = DealAssetList.Instance.Values.ToList();

// iterate through rows and set the column manually
        foreach (DataGridViewRow row in dgvDealAssets.Rows)
        {
            row.Cells["Column2"].Value = ((DealAsset)row.DataBoundItem).otherclass.Name;
        }

但是这个foreach循环需要大约几分钟才能完成(2k元素)。如何解决这个问题?

5 个答案:

答案 0 :(得分:3)

DataGridView不支持对子属性进行数据绑定。有关详情,请查看this post

我喜欢使用CellFormatting事件的解决方案。

答案 1 :(得分:3)

如果你想使用这样的许多子元素:

class MyClass
{
   public int Id;
   public MyOtherClass OtherClass;
}

class MyOtherClass
{
   public string Name;
   public int Number;
}

怎么样

第一个解决方案 在设置数据源之后手动设置某个事件中每个单元格的设置值(mabye,其中一个更好),例如:

private void dgv_CellFormatting( object sender, DataGridViewCellFormattingEventArgs e )
{
   MyClass data = dgv.Rows[ e.RowIndex ].DataBoundItem as MyClass;

   dgv.Rows[ e.RowIndex ].Cells[ "colName" ].Value = data.OtherClass.Name;
   dgv.Rows[ e.RowIndex ].Cells[ "colNumber" ].Value = data.OtherClass.Number;
}

第二个解决方案 如何从数据创建DataTable然后绑定它?

我感谢任何意见; - )

答案 2 :(得分:2)

问题nr.1:

尝试执行以下操作:

  1. 从Object扩展MyOtherClass(可能不需要此步骤)

  2. 并覆盖或创建方法ToString()。

  3. 应该这样做。

答案 3 :(得分:1)

听起来像DataGridView的虚拟模式可以解决您的问题。在虚拟模式下,DataGridView将在需要显示单元格时触发事件。该活动可让您随意填充单元格。虚拟模式的优点是系统只需要提取实际显示的数据,因此在加载所有内容时没有缓慢的启动时间。

    private void my_init_function() {
        datagridview.VirtualMode = true;
        datagridview.CellValueNeeded += new System.Windows.Forms.DataGridViewCellValueEventHandler(datagridview_CellValueNeeded);
    }

    private void datagridview_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {
        e.Value = get_my_data(e.RowIndex, e.ColumnIndex);
    }

答案 4 :(得分:1)

将datagrid的特定列数据绑定到datagrid数据源的子属性的方法是使用DataGridView.Column.Tag属性以及子对象内的ToString() override方法。它如下:

public class Car
{
    public int Id { get; set; }

    public int Name { get; set; }

    public string Colour { get; set; }

    public Wheel Wheel { get; set; }
}

public class Wheel 
{
    public string WheelName { get; set; }

    public override string ToString()
    {
        return WheelName;
    }
}

public class Main
{
   private void LoadGrid(List<Car> data)
   {
       this.dataGridView.Columns["Wheel"].Tag = "WheelName";
   }
}