Можно ли передать или заменить часть контрольного имени? - PullRequest
1 голос
/ 08 марта 2019

Прежде всего я хотел бы, чтобы вы подготовились. Я начал программировать только около 6 недель назад. Я прошу прощения, если последует что-нибудь достойное.

Мне было интересно, можно ли передать только часть имени элемента управления?

Это идея:

У меня две команды, класс настроен так:

public class Team
{
    int    _established; //could be string
    string _name;
    double _best
}
//Snip

У меня есть 2 набора форм, одинаковых для ввода, но единственное отличие - имена:

//Team 1
    team1Year.Text = "";
    team1Name.Text = "";
    team1Numericupdown.Value = 0;
//Team 2
    team2Year.Text = "";
    team2Name.Text = "";
    team2Numericupdown.Value = 0;

Так что, по сути, это то же самое. Мне было интересно, если можно создать метод, который будет делать следующее:

//Snip
Team team1 = new Team()
Team team2 = new Team()
//Not specific to problem, values can be anything
team1.estYear = 2008;
team1.Name = "Teamname1";
team1.Best = 137.8;

team2.estYear = 2009;
team2.Name = "GenericName";
team2.Best = 134.3;




private void HowToMethod(string tm, Team values)
{
    //so it would become like this - replace team1 and team2 with an argument
    tmYear.Text = values;
    tmName.Text = values;
    tmNumericupdown.Value = values;
}

А на практике:

HowToMethod(team1, team1.estYear)
//Output: team1Year.Text = 2008;

HowToMethod(team1, team1.Name)
//Output: team1Name.Text = Teamname1;

HowToMethod(team2, team2.Best)
//Output: team2Numericupdown.Value = 134.3;

Это не обязательно, мне просто интересно, возможно ли такое. Я в порядке, не имея решения этого. Существуют различные элементы управления / формы, но не все они одинаковые, но они принадлежат к одной и той же «группе» по имени. Надеюсь, это не слишком запутало.

EDIT1: Так что я старался быть менее запутанным. Опять же, я прошу прощения за лицо. Английский тоже не мой родной язык, что тоже не помогает. В любом случае, вот оно:

Это работает, но для меня это выглядит как повторяющийся код. Мне было интересно, если есть более простое решение ... это не продвинутая тема

private void button1_Click(object sender, EventArgs e)
{
//Just one example. It's about manipulating Forms/Controls via code
    //Lock Team1's controls
    team1Year.Enabled = false;
    team1Name.Enabled = false;
    team1NumericUpDown.Enabled = false;
    //Lock Team 2's Controls
    team2Year.Enabled = false;
    team2Name.Enabled = false;
    team2NumericUpDown.Enabled = false;
}

private void button2_Click(object sender, EventArgs e)
{
//Another button unlocks
    //Unlock Team1's controls
    team1Year.Enabled = true;
    team1Name.Enabled = true;
    team1NumericUpDown.Enabled = true;
    //Unlock Team 2's Controls
    team2Year.Enabled = true;
    team2Name.Enabled = true;
    team2NumericUpDown.Enabled = true;
}

Хорошо, так что вышеприведенное работает - вручную выберите элементы управления, которые мы хотим отключить Может ли это быть что-то вроде это: Извиняюсь, если не использую надлежащие типы объектов

private void MyMethod(int X, bool isItEnabled)
{
//This feels so, so wrong
    Control ctrl = sender as Control;
    team{X}Year.Enabled ;
    team{X}Name.Enabled = {isItEnabled};            
    team{X}NumericUpDown.Enabled = {isItEnabled};  
}

//In action:
private void button1_Click(object sender, EventArgs e)
{

MyMethod(1, false)
//Would mean/become:
    team{1}Year.Enabled = {false};
    team{1}Name.Enabled = {false};
    team{1}NumericUpDown.Enabled = {false};

//Or if the method was implemented differently:

private void MyMethod(string prefix, bool isItEnabled)
{
    {prefix}Year.Enabled ;
    {prefix}Name.Enabled = {isItEnabled};            
    {prefix}NumericUpDown.Enabled = {isItEnabled};            
}

// В действии:

MyMethod(team2, true)
//Would mean:
    {team2}Year.Enabled = {true};
    {team2}Name.Enabled = {true};
    {team2}NumericUpDown.Enabled = {true};

Таким образом, переданные аргументы могут заменить только часть имени элемента управления если они имеют общее последовательное имя

В заключение:

** Можно ли ввести переменную для замены части кода на модульность **: // Превращение идеи в метод будет вторичным может стать:

X = "team1";

Properties.Settings.Default.{X}Totals;
{X}Year.Text = "";
{X}Name.Text = "";
{X}Whatever.Text = "";
{X}NumericUpDown.Value = 135;

Я знаю, что это работает с классами:

private void TeamStuff(Team teamID, string value1, string value2)
{
teamID.Year = value;
teamID.Name = value;
//...etc
}
//then
TeamStuff (team1, "sample", "GenericName");
//becomes
team1.Year = "sample";
team1.Name = "GenericName";

1 Ответ

0 голосов
/ 08 марта 2019

Я действительно не знаю, что вы пытаетесь сделать, и я думаю, что могут быть лучшие способы сделать это, но чтобы ответить на ваш конкретный вопрос, вот реализация HowToMethod

private void HowToMethod(string tm, Team values)
{
    var yearControlName = tm + "Year";
    foreach(var ctrl in Controls)
    {
        if (ctrl is TextBox)
        {
            var tb = (ctrl as TextBox);
            if (tb.Name == yearControlName)
                tb.Text = values.EstYear.ToString();
        }
    }
}

Это только для показа EstYear, но этого достаточно для того, чтобы попробовать себя и реализовать все остальное,

P.S. Конечно, этот код может быть короче с Linq, но для простоты, поскольку OP - новый программист, давайте сохраним его таким образом.

Редактировать

Теперь все стало более понятным, ответ - нет, вы не можете сделать это так, как вы это сделали, если вы хотите выбрать элемент управления на основе значения переменной (что хорошо в определенных обстоятельствах), это хорошо, но вы нужно сделать что-то, как я показал в приведенном выше коде, то есть перебрать все элементы управления и проверить, соответствует ли имя вашему желанию.
Дело в том, что ваш код проходит через процесс компиляции, и для компилятора, например, допустимое имя элемента управления, является ли текст, который вы там написали, а не комбинацией переменных, которые могут давать одно и то же имя, почему? Потому что переменные не получают свое значение до тех пор, пока вы не запустите свой код, и это происходит после того, как вы скомпилировали свой код и без правильного имени, произойдет сбой компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...