QuantumNova Ответов: 2

Как ссылаться на кнопки с помощью строк и добавлять теги


Здравствуйте, я пытаюсь ссылаться на кнопки с именами Btn1, Btn2, Btn3.... Преобразуя имена нажатой кнопки в int и добавляя число, чтобы получить нужную мне кнопку, а затем добавляя еще один тег к уже существующим тегам на этой кнопке, помощь будет очень признательна.

Что я уже пробовал:

private void Btn_clicked(object sender, RoutedEventArgs e)
{

    if (sender is Button btn)
    {
             string SelectButton = btn.Name.Remove(0, 3);
             //removes the Btn part and leaves the int

             int BtnNum = Convert.ToInt32(SelectButton);
             var Destination = Convert.ToString(BtnNum + 8);
             Destination.Tag = Destination.tag + "active";
    }

}

2 Ответов

Рейтинг:
5

BillWoodruff

Предположим, что вы действительно хотите отслеживать текущую активную кнопку:

private Button ActiveButton = null;

private void Buttons_Click(object sender, EventArgs e)
{
    ActiveButton = sender as Button;

    if (ActiveButton is null) throw new NullReferenceException("that's not a Button");

    // calculate the nexf Button ?
}
Чтобы выйти за рамки этого, мне нужно было бы узнать больше о том, что делают кнопки. Может ли быть активна более чем одна кнопка ? Прямо сейчас ваш код может продолжать добавлять "активный" к тегу кнопки с каждым щелчком мыши: это не имеет смысла.

Если кнопка теряет фокус, нужно ли отслеживать это в коде ?

Предложение: используйте словарь:
Dictionary<string, Button> BtnNameToButton = new Dictionary<string, Button>();

private void Form1_Load(object sender, EventArgs e)
{

    foreach (Button btn in this.Controls.OfType<Button>())
    {
        BtnNameToButton.Add(btn.Name, btn);
    }
}


QuantumNova

Нет, я использовал "активный" в качестве тега только для того, чтобы сказать мне, что я могу использовать позже в программе, на данный момент это всего лишь заполнитель, главное, что я хотел бы знать, это как я буду ссылаться на кнопку, используя ее имя в Строковой форме, и добавить дополнительный тег к этой кнопке. Если бы вы могли помочь, это было бы очень ценно :)

BillWoodruff

см. пересмотренное сообщение.

QuantumNova

Спасибо, очень ценю :)

BillWoodruff

конечно. до сих пор не ясно, каковы ваши намерения в изменении тегов кнопок.

Maciej Los

5ed!

Рейтинг:
15

OriginalGriff

Вместо того чтобы рассуждать подобным образом, создайте коллекцию в своем классе форм и попросите ее удерживать кнопки - массив или список "кнопка"подойдет.

Тогда все, что вам нужно сделать, это найти кнопку в коллекции, и вы уходите.

private List<Button> buttons = new List<Button>();
private void Btn_clicked(object sender, RoutedEventArgs e)
    {
    if (sender is Button btn)
        {
        int index = buttons.IndexOf(btn);
        Button destination = buttons[(index + 8) % buttons.Count];
        destination.Tag += "active";
        }
    }
И это не зависит от названия кнопки - так что ваш код может быть более читабельным и ремонтопригодным в будущем.


QuantumNova

Привет, это большое спасибо. Но просто из любопытства, есть ли способ ссылаться на кнопку непосредственно, используя ее имя в Строковой форме, как я уже пробовал выше?

OriginalGriff

Вы можете, но это много обмана, и это ужасно легко сломать с другими изменениями в вашем коде позже.
Вы можете сделать это - просто рекурсивно пройти по массиву элементов управления в поисках элемента управления, который является кнопкой, имеющей определенное свойство Name.
Но... добавьте еще одну кнопку в середине, или измените имя кнопки, чтобы улучшить вашу самодокументацию, или даже запутайте свой код, и есть хороший риск его взлома. Вот почему я бы предложил коллекцию - она гораздо яснее, что вы пытаетесь сделать, и более надежна / ремонтопригодна.

QuantumNova

Хорошо, спасибо, буду использовать метод, который вы предоставили тогда, очень хорошо :)

OriginalGriff

Всегда пожалуйста!

Maciej Los

5ed!