【问题标题】:HOW TO work with a variable, that is saved in a string content (in C#, WPF)如何使用保存在字符串内容中的变量(在 C#、WPF 中)
【发布时间】:2014-02-06 13:36:08
【问题描述】:

我有一个 for 循环来逐行读取流阅读器。这很好用。现在我在阅读流阅读器的文件时遇到了问题。这是一个包含两列信息的 csv 文件。第一个 (A) 包含一个 C# 元素,如文本框或标签(就像“label_1_title”),它在我的项目中声明。第二个(B)包含一个普通的简单字符串,如“Hello”。

现在我想将 A 列的字符串内容转换为真实存在的元素。示例:我在 A 列中写了“label_1_title”,这是一个元素,存在于我的项目中。现在我想使用这个元素来(例如)将它的内容更改为该行 B 列的内容。

public void SetSprachpaket(string Sprachpaket)
{
    StreamReader StreamReader = new StreamReader(Sprachpaket, Encoding.UTF8);
    string Inhalt = StreamReader.ReadLine();

    for (int i = 1; Inhalt != null; i++)
    {
        var Items = Inhalt.Split(new Char[] { ';' });

        object Element = Items[0].GetType(); // Convert the string content of Items[1] to the existing object
        Element = Items[1]; // Take this existing object and give it the string content of Items[2]

        Inhalt = StreamReader.ReadLine();
    }
    StreamReader.Close();
}

我希望你能帮助我。提前致谢。亲切的问候。

编辑:

object Element = Items[0].GetType(); // Get (let's say) the string "myString"
Element = Items[1]; // --> myString = ...

【问题讨论】:

  • 你的项目是 ASP.NET、WinForms 还是 WPF?
  • Sprachpaket 的例子会很棒

标签: c# wpf string csv streamreader


【解决方案1】:

请不要依赖项目中的内部命名。您应该在元素和列数据之间进行某种显式映射。

将 CSV 文件转储到 A 列 => B 列的Dictionary<string, string>。在包含您要填充的所有元素的元素上,将 DataContext 设置为字典。像这样定义你的标签:

<Label Content="{Binding [label_1_title]}" />

更多详情,请参阅Data Binding Overview。这将查找字典键“label_1_title”并将内容设置为标签加载时的值。

如果您想使用标签字典以外的其他数据绑定,我建议您为 DataContext 使用自定义对象,该对象将字典存储在诸如LabelDictionary 之类的属性中。在这种情况下,绑定应该是:

<Label Content="{Binding LabelDictionary[label_1_title]}" />

【讨论】:

    【解决方案2】:

    只需使用 foreach

    foreach(control x in this.Control)
    {
        if(x.Name == A)  // For A means the name of the object
        { x.Text = B; }  // For B means the string
    }
    

    【讨论】:

    • 谢谢。 “控制”和“this.Control”是什么意思?
    • "this" 指的是表单本身。 “this.control”应该是“this.Controls”表单上所有控件的集合。
    【解决方案3】:

    这并不理想,你需要尝试一下,但我认为在你正在寻找的方向的某个地方。

    while (Inhalt != null)
    {
        switch (Items[0])
        {
            case "label"
                element = new Label();
                element.Text = Items[1];
                break;
            case "textbox"
                element = new Textbox();
                element.Text = Items[1];
                break;
            case "numericUpDown"
                element = new NumericUpDown();
                element.Value = Item[1];
                break;
        }
    }
    

    编辑:如果您不想从头开始填充表单,请使用this.Controls.Find() 查找具有该名称的控件。

    【讨论】:

    • 这并没有解释如何找到实际的元素。您正在创建一个新的
    • 您可能需要将 Element 声明为控件而不是对象,并转换为您在 switch 语句中创建的控件类型。
    • 重点是不应该创建任何控件。您需要找到一个现有的控件,而不是创建一个新的
    【解决方案4】:

    如果 items[0] 是控件的名称,您可以这样做来查找控件

    this.Controls.Find(items[0])

    然后,您可能必须根据要分配给的属性将其转换为适当的类型

    control.Text = items[1];
    

    假设第一列是同一类中字段的名称,而不是控件的名称,您可以这样做

    var field = this.GetType().GetField(items[0], 
                                           BindingFlags.Instance 
                                           | BindingFlags.NonPublic);
    var control = (Control)field.GetValue(this,null);
    control.Text = items[1];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多