2010-08-05 5 views
1

У меня есть код, который создает несколько компонентов одним нажатием кнопки. Что-то вроде этого.C# Как ссылаться на динамически созданный компонент?

CheckBox chk = new CheckBox(); 
chk.Top = 50; 
chk.Left = 50; 
chk.Text = "Check Box Test"; 
chk.Name = "chkTest" 
this.Controls.Add(chk); 

Как я могу использовать этот компонент. Например, я попробовал это, но получил и сказал, что компонент не существует. Я просто хочу получить их ценности.

if(chkTest.Checked) 
{ 
//Do this 
} 

Помогите.

Спасибо,

+0

Откуда взята переменная chkTest? Вы можете определенно получить его (динамически созданный элемент управления) из коллекции Controls и затем передать его в CheckBox для доступа к его свойствам. –

+0

Конечно, вы не можете этого сделать. Элемент управления не волшебным образом отображается как член формы (или любого другого класса, из которого вы его используете). Вам нужно будет использовать переменную-заполнителя 'Form1 {... private ComboBox chkTest; ...} 'или как ** Dave ** предложил извлечь его из коллекции' Controls' вне области переменной 'chk'. –

ответ

3

Либо создать переменную-член в классе под названием chkTest, которые вы можете использовать в дальнейшем, или получить его на лету из коллекции Controls, когда это необходимо, например, так:

CheckBox chkTest = (CheckBox)Controls["chkTest"]; 
if(chkTest.Checked) { 
    // ... 
} 
+0

Использовать 'CheckBox chkTest = Controls [" chkTest "] как CheckBox;' - нет никакого неявного преобразования из 'Control' в' CheckBox'. –

+0

Работал идеально. Благодарю. –

+0

@Jaroslav Jandek спасибо, я обновил сообщение для этого. Кроме того, поскольку мы ожидаем, что это будет CheckBox, нет необходимости использовать оператор as - прямой прилив будет достаточным. – siride

0

Вы ссылаетесь на chkTest, но вы создали chk.

+0

Не имеет значения, какое имя я называю. Я положил chkTest, потому что это то, что дало имя. –

+0

@Ash - где вы объявляете и присваиваете значение переменной chkTest? – TrueWill

0

Вы можете объявить флажок в качестве переменной-члена вашей страницы. Тогда вы сможете получить доступ к ней более легко.

Класс MyPage { CheckBox chkTest;

// затем на странице load // chkTest = new CheckBox(); ...

}

+0

Выполнение этой задачи - это то, чего я пытаюсь избежать. –

+0

@Ash Burlaczenko: это микро-оптимизация, которая на самом деле не спасет вас, и на самом деле может привести к увеличению времени памяти и времени процессора, чтобы найти элемент управления из коллекции. – siride

+0

Как вы ожидаете, что это экономит память? –

0
if ((Controls.Items["chkTest"] as CheckBox).Checked) 
{ 
// Do this 
} 

должен работать, но это некрасиво смотреть. :)

Вы могли бы объявить его в качестве переменной, а затем использовать его, как вы делали:

CheckBox chkTest = Controls.Items["chkTest"] as Checkbox; 
if (chkTest.Checked) 
{ 
// Do this 
} 

Посмотрите на этой удобной странице способов работы и получить доступ к коллекции элемента управления пунктов: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection_members.aspx

+0

Вы должны убедиться, что chkTest не имеет значения null перед использованием, когда вы используете оператор as. –

1

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

chk.Checked += new RoutedEventHandler(CheckBox_Checked); 
chk.Unchecked += new RoutedEventHandler(CheckBox_Checked); 

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
{ 
    CheckBox chkBox = sender as CheckBox; 
    if (chkBox.IsChecked.Value) 
    { 
     // Do this... 
    } 
} 

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

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