【问题标题】:how to apply more than one .Tag property in C#?如何在 C# 中应用多个 .Tag 属性?
【发布时间】: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 函数,以便加载两个数据

标签: c# asp.net winforms datagrid tags


【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2012-07-06
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多