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

Posted

技术标签:

【中文标题】如何在 C# 中应用多个 .Tag 属性?【英文标题】:how to apply more than one .Tag property in C#? 【发布时间】:2012-11-08 05:27:17 【问题描述】:

当我想存储/传递一个值时,我总是使用 .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; 我该怎么做? 谢谢

【问题讨论】:

也许你可以存储为逗号分隔或另一个限制器,你可以将其拆分然后使用它 嗯,我不认为用逗号分隔它是正确的做法。因为我必须存储 2 个不同的值,然后将它们都传递给我的 Load 函数,以便加载两个数据 【参考方案1】:

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

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();

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

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

【讨论】:

所以,我已经尝试了您的解决方案,但 Form prosesEdit = new FormProsesChemicalRawWbEdit(value1, value2); 抛出一个错误,指出 MercindoLeather.Chemical.Proses_Chemical.Raw_WB.FormProsesChemicalRawWbEdit' does not contain a constructor that takes '2' arguments【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以按照已经建议的方式创建一个包含两个以上字段的类 - 或者 - 在标签上创建一个列表(或一个数组,任何最适合的):

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

很少值转换不是问题,但是如果您需要很多值,您当然会在标签外部处理列表,然后在完成时将其设置在标签上。

(我不是一个真正的 C# 人,所以提前为可能的语法错误道歉)

【讨论】:

是的,差不多。不用担心,要点就在那里。在某些非常特殊的情况下,VB.NET 和 C# 仍然相距甚远。 =)【参考方案4】:

将您的两个值存储在一个元组中并将其分配给标签。

【讨论】:

以上是关于如何在 C# 中应用多个 .Tag 属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中解析多个元素属性值

如何找到匹配多个条件的元素

在引导程序中禁用输入。如何将其应用于不同的 TAG?

C#中多个不同控件之间如何设置Tab顺序?

如何在 C# 中创建具有命名空间的文档

如何在 C# 中创建具有命名空间的文档