Я хочу использовать переменную, здесь я использую TextName в качестве переменной. затем используйте его КАК свойство. Конечно, я не могу, потому что это строка, но как мне заставить переменную/строку обрабатываться как текст в строке, которую она содержит? В таблицах Google это очень похоже на то, что называется INDIRECT, чтобы иметь возможность быть данными, на которые вы ссылаетесь.
// Code I like to write:
TextName = "richTextBox";
TextName.Text = "text for richTextBox";
Я хочу, чтобы этот код рассматривался как
richTextBox.Text = "text for richTextBox";
но с richTextBox.Text
полностью или частично, чтобы быть переменной, так что я могу поместить все это в метод и изменить только переменную, а не иметь весь метод по всему коду снова и снова.
Я использую .NET6.0, если это имеет значение.
@madreflection да, я точно хочу использовать переменную или указать, к какому свойству нужно получить доступ.
Вам нужно использовать что-то вроде FindControl(TextName)
или Controls.Where(c => c.Name == TextName)
. Но часто необходимость в этом является результатом серьезной дизайнерской ошибки, допущенной ранее, и вам лучше вернуться к чертежной доске и понять, почему вы оказались в таком положении.
@JoelCoehoorn Могу ли я получить полный пример? (я попробовал и получил, что FindControl не существует в текущем контексте) добавление пробела дает массу ошибок, а Controls. Где не сказано определения для Где. Кроме того... я не уверен, как это может быть серьезной ошибкой проектирования, конечно, поиск чего-то с помощью переменной намного эффективнее, когда вы пишете весь метод снова и снова и имеете сотни тысяч строк кода для чего-то, что нужно только один свойство. РЕДАКТИРОВАТЬ; При ближайшем рассмотрении я думаю, что просто FindControl не принимается, работает ли он на .NET6?
Я полагаю, вы собираетесь сделать это в форме. В этом случае вы можете добавить этот код в свою форму:
public string this[string name]
{
get
{
return this.Controls.ContainsKey(name) ?
this.Controls[name].Text :
null;
}
set
{
if (this.Controls.ContainsKey(name))
{
var control = this.Controls[name];
control.Text = value;
}
}
}
И получить/установить текст любого Control
таким образом:
this["richTextBox"] = "text for richTextBox";
var text = this["richTextBox"];
this
ваша форма.
Если вы собираетесь использовать несколько форм, вы можете создать методы расширения:
public static class FormExtends
{
public static string GetText(this Form form, string name, string defaultText = null)
{
return form.Controls.ContainsKey(name) ?
form.Controls[name].Text :
(defaultText ?? string.Empty);
}
public static void SetText(this Form form, string name, string text)
{
if (form.Controls.ContainsKey(name))
{
var control = form.Controls[name];
control.Text = text;
}
}
}
И упростите код в каждой форме:
public string this[string name]
{
get { return this.GetText(name); }
set { this.SetText(name, value); }
}
хорошо, я снова и снова отвечал или возился с чем-то еще, так как это звучит глупо, но что-то простое должно быть у меня в голове, я использовал это и все еще пробовал TextName или текст вместо свойства, которое записывает массив, но ... ммм, ничего, это просто дает мне текст для richTextBox ВНУТРИ текстового поля вместо числа 5, вытаскиваемого из массива.. Как я могу на самом деле использовать это?
подождите, возможно, у меня это заработало (я бы отредактировал, но мне сказали, что я не могу редактировать дольше, чем 5 минут >_>;)
Для зрителей позже я не использую this["richTextBox"] = "text for richTextBox"; var text = это["richTextBox"]; вместо этого я использую this[TextName] (или другую переменную, которая является строкой) вместо имени элемента управления, и это работает. Все еще нужно, чтобы другая часть кода, который он разместил, была где-то. Спасибо Виктор!
form.Controls["xxx"] дает вам экземпляр Control с именем Name="xxx". Вы можете использовать строку напрямую или переменную типа string, это одно и то же. Любой производный класс Control (TextBox, RichTextBox...) имеет свойство Text, которое является свойством, которое получают/устанавливают методы расширения.
Мне кажется, что вы хотите использовать переменную, чтобы указать, к какому свойству обращаться, например, как JavaScript позволяет вам сказать
obj[a]
, и еслиa
равно"name"
, вы получитеobj.name
. Это то, что ты имеешь в виду?