自定义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
        }
    }
}

正如你在评论中看到的,我无法获得布尔值来告诉我一行是否为子行。我想在转换过程中我总是得到默认值(false(。

我想我需要将DataGridView.Rows集合更改为MyRow的列表,而不是DataGridViewRow,这样我就可以避免强制转换。问题是我不知道该怎么做。我试图制作一个List<MyRow>,但由于与DataGridViewRowCollection兼容,它不起作用,然后我试图从中继承,什么都没有。

我会提供一些例子,但我想先知道是否值得一试。感谢

从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;
    }
}