自定义DataGridViewRow问题:获取自定义属性始终是默认值(false)

我试图做一些自定义的DataGridViewRow样式的目的,并实现自定义展开/折叠行系统。

我已经尝试了这样一个基本的行类骨架:

 class MyRow : DataGridViewRow { public Boolean IsChild; } 

和一个自定义的DataGridView是这样的:

  public partial class MyGrid : DataGridView { public MyGrid() { InitializeComponent(); RowTemplate = new MyRow(); } } 

然后在我的Form我使用它是这样的:

 public Form1() { InitializeComponent(); myGrid1.Rows.Add(new MyRow()); myGrid1.Rows.Add(new MyRow() { IsChild = true }); myGrid1.Rows.Add(new MyRow() { IsChild = true }); for (int i = 0; i < myGrid1.RowCount; i++) { MyRow r; if (myGrid1.Rows[i] is MyRow) { MessageBox.Show(":)"); r = (MyRow)myGrid1.Rows[i]; // r = myGrid1.Rows[i] as MyRow; } else { continue; // It's ok, we never run this part } if (r.IsChild) // Never true { r.Visible = false; MessageBox.Show(":C"); // Never prints this } } } 

正如你在评论中所看到的,我无法得到布尔值,它会告诉我一行是否是孩子。 我总是得到默认值(错误)在演员,我想。

我想我需要将DataGridView.Rows集合更改为MyRow而不是DataGridViewRow的列表,以便我可以避免投射。 问题是,我不知道如何做到这一点..我试图做一个List<MyRow>但不会因为与DataGridViewRowCollection的兼容性,然后我试图从它inheritance,没有任何工作。

我会提供一些例子,但我想知道如果这是值得的尝试。 谢谢

从MSDN ,您从DataGridViewRow派生,然后将新的属性添加到派生类时所需要的是重写Clone方法克隆操作过程中复制新属性。

我刚刚测试了你的代码,并且在添加clone方法后它工作正常。

 class MyRow : DataGridViewRow { public bool IsChild { get; set; } public override object Clone() { var clonedRow = base.Clone() as MyRow; clonedRow.IsChild = this.IsChild; return clonedRow; } }