1

В моем MainPage.xaml есть 20 кнопок управления с именем btn1, btn2, btn3, ... ... btn20. Теперь мне нужно использовать эти кнопки в коде.Преобразование строки в контрольное имя C# wp8.1

Я планирую использовать цикл for и делать код для каждой кнопки. Но моя проблема в том, что я не могу преобразовать строку в имя Button.

Например,

for (int i = 1; i <=20; i++) 
{ 
    string button = "btn" + i; 

    // Convert string to button somehow 
    // Do something with button 
} 

Я искал на Google и есть много статей о преобразовании имени управления из строки. Но они предназначены для Windows Forms. Приложения для телефонов Windows не поддерживают эти пространства имен.

+0

Что вы имеете в виду при преобразовании строки для управления имени? Вы имеете в виду создание экземпляра класса управления, зная его имя? Например, 'TextBox'? –

+0

Я отредактировал свой вопрос. Проверьте это –

+0

А, я вижу. Я понимаю, что проблема –

ответ

2

Вы можете сделать так

for (int i = 1; i <=20; i++) 
{ 
     Button ele = (Button) MainGrid.FindName("btn"+i); 
} 

Здесь MainGrid это имя элемента сетки, которая имеет кнопки управления

+0

Спасибо за ваш ответ. Почти 90% исправлены. Но ты пропустил линию. –

+0

@ShahriarSirajSnigdho Как я уже сказал в вашем автоответчике, вы должны указать Archana, как улучшить свой собственный ответ, и BTW, нет ничего плохого в этом ответе. Он просто дал вам намек. Использование 'is', а затем' as' выбрасывает объект дважды, но для меня этого недостаточно, чтобы не считать этот ответ правильным ... ....... –

+0

Я только что написал «is " состояние. Если вы чертовски уверены, что его элемент кнопки, то вы можете удалить эту строку – Archana

1

Вы не может преобразовать строку в экземпляр кнопки, но вы должны получить значение btnNbtn1) поля класса с использованием отражения:

Button button = (Button)GetType().GetField($"btn{i}", BindingFlags.Instance).GetValue(this); 

или даже более эффективный способ: использование словарь для поиска кнопки:

// Place this in your form constructor 
Dictionary<string, Button> buttons = new Dictionary<string, Button> 
{ 
    { "btn1", btn1 }, 
    { "btnN", btn2 } 
}; 

// and later where you want to get your buttons by their name... 
Button btn1 = buttons[$"btn{i}"]; 
+0

GetField и BindingFlags не существуют в текущем контексте :( –

+0

@ShahriarSirajSnigdho Действительно?;) Вы вызывали 'GetType(). GetField()' или 'GetField()' напрямую? И BindingFlags является членом пространства имен System.Reflection ... добавьте использование во все пространство имен –

+0

@ShahriarSirajSnigdho BTW, почему бы вам не пойти со вторым подходом? Тот, который использует словарь. Это лучше, чем отражение с точки зрения эффективности. –

0

Наконец я нашел решение

for (int i = 1; i <= 20; i++) 
     { 
      var ele = GridMain.FindName("btn" + i); 

      // @Archana you missed this line 
      Button button = ele as Button; 

      // Do what you want to do with your control 
      button.Background = background; 
      button.Foreground = foreground;     
     } 
+3

Кстати, я не считаю честным ваш автоответчик. Вы должны бросить его и пометить Archana один как правильный, если он дал вам правильное направление решения –

+0

Конечно! @ matías-fidemraizer –

+0

Вы можете напрямую присвоить значение FindName типу Button. Нет необходимости в дополнительной строке (кнопка Button = ele as Button) – Archana

Смежные вопросы