如何在C#中应用多个.Tag属性?

时间:2012-11-20 07:14:30

标签: c# asp.net winforms datagrid tags

当我想存储/传递一个值时,我总是使用.Tag属性。例如,当我存储值:

Form prosesEdit = new FormProsesChemicalRawWbEdit();
                        prosesEdit.Tag = (int)this.proses_chemicalDataGridView.Rows[e.RowIndex].Cells[1].Value;
                        prosesEdit.ShowDialog();

然后,我会将值传递到我的EDIT表单中:

proses_chemical_id = (int) this.Tag;
            this.proses_chemicalTableAdapter.FillByChemId(this.mcd_softwareDataSet.proses_chemical, proses_chemical_id);
            this.proses_chemical_listTableAdapter.FillByChemId(this.mcd_softwareDataSet.proses_chemical_list, proses_chemical_id);

但是最近,我应该存储&传递2个不同的值。我们说(int)this.proses_chemicalDataGridView1.Rows[e.RowIndex].Cells[1].Value;(int)this.proses_chemicalDataGridView2.Rows[e.RowIndex].Cells[1].Value; 我到底该怎么做? 感谢

4 个答案:

答案 0 :(得分:2)

到目前为止给出的两个答案都有效,但我想详细说明答案并提供替代方案。假设您创建了自己的类:

public class YourClass
{
    public int ProsesChemicalId1 { get; set; }
    public int ProsesChemicalId2 { get; set; }
}

然后,您可以将类的实例分配给Tag属性,如下所示:

YourClass yourClass = new YourClass();
yourClass.ProsesChemicalId1 = this.proses_chemicalDataGridView1.Rows[e.RowIndex].Cells[1].Value;
yourClass.ProsesChemicalId2 = this.proses_chemicalDataGridView2.Rows[e.RowIndex].Cells[1].Value;

Form prosesEdit = new FormProsesChemicalRawWbEdit();
prosesEdit.Tag = yourClass;
prosesEdit.ShowDialog();

你可以从Tag属性中取出类的实例,如下所示:

yourClass = (YourClass) this.Tag;
this.proses_chemicalTableAdapter.FillByChemId(this.mcd_softwareDataSet.proses_chemical, yourClass.ProsesChemicalId1);

但是,使用Tag属性在表单中传递值通常是不好的做法,因为它需要大量的类型转换以及每个标记中存储的内容的知识。

更健壮的方法是使用构造函数注入,因为您知道要创建的表单类型:

int value1 = this.proses_chemicalDataGridView1.Rows[e.RowIndex].Cells[1].Value;
int value2 = this.proses_chemicalDataGridView2.Rows[e.RowIndex].Cells[1].Value;

Form prosesEdit = new FormProsesChemicalRawWbEdit(value1, value2);  
prosesEdit.ShowDialog();

然后,您很可能必须将这些值存储为表单内的属性或字段。这是一种更强大的方法,因为它可以抵抗意外变化。换句话说,如果您将来需要传递第3个值,那么您不太可能忘记更改需要更改的代码。

你也可以在这里使用房产注资,但我不确定你的要求,所以我会留给你决定。

答案 1 :(得分:1)

为它创建一个新类。在其中创建两个属性。在标记中发送该类的对象。明天如果需要第三个值,则添加一个新属性。

答案 2 :(得分:1)

你可以按照已经建议做的,并创建一个包含两个+字段的类 - 或者 - 在标记上创建一个列表(或一个数组,最适合的):

this.Tag = new List<int>();
((List<int>)this.Tag).Add(value1);
((List<int>)this.Tag).Add(value2);
...

使用少量值进行投射不是问题,但如果您需要许多值,您当然会在标签外部处理列表,然后在完成时将其设置在标记上。

(我不是一个真正的c#家伙因此可能会因语法错误而道歉)

答案 3 :(得分:0)

将两个值存储在元组中并将其分配给标记。