如何在 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 属性?的主要内容,如果未能解决你的问题,请参考以下文章