0

这个概念很简单。用户选择一行并单击“编辑”,打开表单,该行中的所有数据都在编辑表单的透视字段中。

我使用 SelectedItems[0].Tag 对 ListView 执行此方法没有问题,但现在使用 DataGridView 并且我得到一个未设置为对象实例的对象引用。

我一直在谷歌搜索,似乎可以完成的唯一方法是首先将 DataGridView 行的值放入列表中。

所以像 firstcell = part.item1、secondcell = part.item2 等。

最后告诉它 List = part;

    private void EditPart()
    {
        PartData part;

        // Ignore if no row is selected
        if (DgParts.SelectedRows.Count == 0)
        {
            return;
        }

        try
        {
            // Is not tagging data at all.
            part = (PartData) DgParts.SelectedRows[0].Tag;

            // Open Form with Data
            var edit = new FrmPartsAddEdit(this, "Edit", part);

            // Commit if OK
            if (edit.ShowDialog() == DialogResult.OK)
            {
                part = edit.GetPart();
            }
        }
        catch (Exception ex)
        {
            MessageBoxError(ex.Message);
        }
    }

DataGridView 处于全行选择状态,多选为 false。

4

3 回答 3

1

整个 WinForms 中使用的 Tag 属性在内部不使用。如果您觉得它有用,它就在那里供您使用。它必须被设置为某物才能有某物。

Tag 属性在这里不合适。您需要的是可以获取 DGV 行并将其转换为 PartData 的东西,然后可以将其传递给您的对话 ctor。

大概 DGV 行包含(在其列中)构成 PartData 的所有内容。

于 2013-03-15T20:33:33.403 回答
1

DgParts.SelectedRows[0].Tag与其发送,不如发送DgParts.SelectedRows[0]。这将是一个DataGridViewRow.

然后在您发送 this 的类中DataGridViewRow,假设它被称为myRow,您可以使用myRow.Cells['column name']or浏览元素myRow.Cells[columnIndex]。或者您可以遍历元素。

另一种方法是使用DgParts.SelectedRows[0].Cells.List. 这会将行的内容发送到ArrayList.

有关更多信息,请查看:

DataGridViewRow 类

于 2013-03-15T20:51:29.693 回答
0

警告:VB 语法,但很容易转换为 C#。

假设PartData是代表您的数据的类,您希望将通用部件列表绑定List(Of PartData)到 DataGridView。然后在SelectionChanged事件中,您可以获得对在 List 中选择的 PartData 对象的基础引用,并将其传递给编辑表单的构造函数进行编辑:

If DgParts.CurrentRow.DataBoundItem IsNot Nothing Then

    Dim f as New EditPartForm(DgParts.CurrentRow.DataBoundItem)

End If

的构造函数EditPartForm将采用 type 的参数PartData

需要记住的一件事是将 List(Of PartData) 绑定到 DataGridView 将为 PartData 类的每个属性显示一列。您必须.Visible = False在不想显示的每一列上进行设置。

于 2013-03-15T20:42:42.327 回答