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

时间:2014-04-30 10:43:36

标签: c# .net windows winforms datagridview

我正在尝试为样式目的制作一些自定义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的兼容性,这不起作用,然后我试图继承它,什么都没有。

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

1 个答案:

答案 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;
    }
}