КАК работать с переменной, которая сохраняется в строковом контенте (в C#, WPF)
У меня есть цикл для чтения строки за строкой читателя потока. Это работает очень хорошо. Теперь у меня проблемы с чтением файла потокового ридера. Это CSV-файл, который содержит два столбца с информацией. Первый (A) содержит элемент C#, такой как текстовое поле или метку (так же, как "label_1_title"), который объявлен в моем проекте. Второй (B) содержит обычную простую строку, например "Hello".
Теперь я хочу преобразовать содержимое строки столбца в реально существующий элемент. Пример: у меня написано "label_1_title" в столбце A, и это элемент, который существует в моем проекте. Теперь я хочу использовать этот элемент, чтобы (например) изменить его содержимое на содержимое столбца 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 = ...
4 ответа
Просто с помощью 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
}
Пожалуйста, не полагайтесь на внутренние имена в вашем проекте. У вас должно быть какое-то явное отображение между элементами и данными столбца.
Дамп файл CSV в Dictionary<string, string>
столбца A => столбца B. Для элемента, содержащего все элементы, которые вы хотите заполнить, установите DataContext в словарь. Определите ваши ярлыки следующим образом:
<Label Content="{Binding [label_1_title]}" />
Для получения дополнительной информации см. Обзор привязки данных. Это будет искать ключ словаря "label_1_title" и установить содержимое в значение, когда метка загружается.
Если вы хотите использовать дополнительную привязку данных, кроме словаря меток, я рекомендую использовать пользовательский объект для DataContext, который хранит словарь в свойстве, таком как LabelDictionary
, В этом случае привязка должна быть:
<Label Content="{Binding LabelDictionary[label_1_title]}" />
Это не идеально, вам нужно поиграть с этим, но я думаю, что где-то в том направлении, которое вы ищете.
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()
чтобы найти контроль с этим именем.
Если элементы [0] - это имя элемента управления, вы можете сделать это, чтобы найти элемент управления.
this.Controls.Find(пункты [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];