2015-06-05 16 views
-2
foreach(Control c in tabAppreciation.Controls) 
     { 
      if(c is Button) 
      { 
       if((Button)c.Text.ToString()==0) 
       { 
        c.BackColor = Color.Green; 
       } 
      } 
     } 

Я получаю ошибки: Невозможно преобразовать тип «строка» в «System.Windows.Forms.Button»Невозможно преобразовать тип «строка» в «» System.Windows.Forms.Button

Я хочу сравнить текст каждой кнопки с чем-то, и если она соответствует, измените цвет кнопки, но похоже, что я не делаю это правильно ... Может ли кто-нибудь помочь мне, пожалуйста?

+6

Проверьте свои круглые скобки ... Я думаю, вы хотели '(Button c) .Text.ToString()', и тогда вы, вероятно, захотите сравнить его со строкой, поэтому '(Button c) .Text.ToString() == '0'' – Dannnno

+5

@Dannnno на правильном пути, но он означает '((Button) c)' а не '(Button c)' – adv12

+2

Упс,^что он сказал – Dannnno

ответ

0

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

foreach(Control c in tabAppreciation.Controls) 
{ 
    Button button = c as Button 
    if(button != null && button.Text == "0") 
    { 
    button.BackColor = Color.Green; 
    } 
} 
5

Вы можете изменить свой код на более простой

foreach(Button b in tabAppreciation.Controls.OfType<Button>()) 
{ 
    if(b.Text=="0") 
    { 
     b.BackColor = Color.Green; 
    } 
} 

Это перечисляет все элементы управления Button типа внутри коллекции tabAppreciation элементов управления и ваш цикл сильно типизированный, так что вам не нужно больше теста для Is Button. Также обратите внимание, что свойство Text уже является строкой, и поэтому применение ToString() не имеет смысла. Наконец строка должна быть по сравнению с строкой (поставить ноль в двойных кавычках не одиночные кавычки, обозначающая полукокс)

FYI: Чтобы использовать OfType<T>, если он еще не существует, необходимо добавить using System.Linq; директивы в верхней части вашего файла кода.

0

Вы почти находитесь. Если у вас есть кнопки управления в коллекции tabAppreciation.Controls, вам нужно всего лишь сравнить текст (вы указали в своем вопросе: I wanna compare the text of each Button with something and if it matches). Поэтому измените код на что-то вроде этого:

foreach(Control c in tabAppreciation.Controls) 
{ 
    if(c is Button) 
    { 
     Button button = (Button)c; 
     if(button.Text=="Button text") 
     { 
      c.BackColor = Color.Green; 
     } 
    } 
} 

Я не уверен, почему вы проверяете, соответствует ли ваш текст числу. Если в тексте вашей кнопки отображается номер, то вам нужно отметить, что существует разница между "0" и 0 - первая имеет тип string, а второй тип int (и '0' - это другой тип - символ).

Метод ToString() всегда возвращает строку, поэтому она должна быть легко построить условие (правило большого пальца) - обе стороны между оператором условия должны иметь тот же тип, поэтому после ToString()= он должен прийти строку - "0" или "text ...".

1

Попробуйте это:

tabAppreciation 
.Controls 
.Select(c => c as Button) 
.Where(c => c != null) 
.Where(b => b.Text.ToString() == "0") 
.ForEach(b => b.BackColor = Color.Green) 
; 
+0

Well это похоже на стрельбу из комара с пушкой, но, тем не менее, +1 – Steve

0

(Button)c.Text.ToString() пытается бросить свойство Text в кнопку. Это ваша ошибка. Вам фактически не нужно бросать объект c в Button, так как свойство Text наследуется от ButtonBase, которое переопределяет свойство Text из класса управления. Структура .NET достаточно умна, чтобы знать, что вы имеете в виду переопределенное свойство Text, а не базовое.

Для доступа к кнопке c вам необходимо создать новую переменную кнопки и установить ее значение как c; Button b = c as Button.

Вам также не нужно звонить ToString() на строку.

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