我正在尝试为样式目的制作一些自定义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
}
}
}
正如您在评论中看到的那样,我无法获得布尔值,它将告诉我行是否为子行。我总是在演员阵容期间得到默认值(false)。
我想我需要将DataGridView.Rows
集合更改为MyRow
而不是DataGridViewRow
的列表,以便我可以避免投射。问题是我不知道该怎么做..我试图制作一个List<MyRow>
,但由于与DataGridViewRowCollection
的兼容性,这不起作用,然后我试图继承它,什么都没有。
我将提供一些例子,但我想首先知道是否值得尝试。 感谢
答案 0 :(得分:1)
从MSDN开始,从DataGridViewRow
派生然后向派生类添加新属性时需要的是覆盖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;
}
}