从DataGridViewRowCollection转换为DataGridViewRow的子级

时间:2014-06-19 16:22:10

标签: c# winforms datagridview casting

可怕的头衔,让我解释一下。我有一个DataGridView,我想通过向每个单元格,每列和每行添加一些属性来自定义一点。我无法解决的问题是如何从DataGridView.Rows对象中拉出我的CustomDataGridViewRow(我的继承DataGridViewRow的类),因为那是DataGridViewRow的集合。

如果我对cast的理解是正确的,那么将DataGridViewRow转换为CustomDataGridViewRow是错误的(也是不可能的),但正如我所看到的,访问DataGridView的行集合的唯一方法是通过DataGridView.Rows。

这就是我想要做的事情,基本上是:

foreach(CustomDataGridViewRow row in myDataGridView.Rows) // <-- throws InvalidCastException
{
    //do something with each row's custom property
}

CustomDataGridViewRow定义非常简单:

class CustomDataGridViewRow : DataGridViewRow
{
    string RowType;
    public CustomDataGridViewRow() { }
}

正确的方法是什么?

编辑:这里是踢球者...上面的代码抛出了InvalidCastException,正如预期的那样,但同样的事情与CustomDataGridViewColumn(通过DataGridView.Columns访问)和CustomDataGridViewCell(通过访问访问)完美配合DataGridView.Rows [I] .Cells)。自定义类的定义方式与上面相同...我可以遍历它们,并且可以编辑和保留派生类的属性。把头发拉出来!

2 个答案:

答案 0 :(得分:0)

我不知道如何让您的实施工作,但如果我正在设计您需要的东西(如果我理解正确的话),请按照我的方式进行操作。

public class MyRowData { }
public class MyCellData { }
public class MyColumnData { }
public static class Extender
{
    static Dictionary<DataGridViewRow, MyRowData> dictRow = new Dictionary<DataGridViewRow, MyRowData>();
    static Dictionary<DataGridViewCell, MyCellData> dictCell = new Dictionary<DataGridViewCell, MyCellData>();
    static Dictionary<DataGridViewColumn, MyColumnData> dictColumn = new Dictionary<DataGridViewColumn, MyColumnData>();
    public static MyRowData GetMyRow(this DataGridViewRow row)
    {
        MyRowData myRow;
        if (dictRow.TryGetValue(row, out myRow))
            return myRow;
        return null;  // or throw error or return blank MyRow...
    }
    public static void SetMyRow(this DataGridViewRow row, MyRowData myRow)
    {
        dictRow[row] = myRow;
    }
}

我只输入了行扩展的代码,但是列和单元格完全相同。您可能在克隆或投射方面遇到问题,但可以解决这些问题。

只是一个建议,以防您无法使代码正常工作......

答案 1 :(得分:0)

或者......(呃呃,不知道我为什么不早点想到它)只需使用单元格/列/行标签:

        cell.Tag = new MyCellData();
        row.Tag = new MyRowData();
        column.Tag = new MyColumnData();

现在,您可以将属性添加到&#34;我的&#34;类:

public class MyCellData {
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}