2014-12-30 3 views
3

Я обновляю некоторый код, чтобы разрешить Option Strict On. Одна из проблем, которая возникает, является поздним связыванием. У меня есть Form с несколькими необходимыми товарами разных типов (TextBox, ComboBox и т. Д.). У меня есть функция проверки действительности Form, а затем установите фокус на первый элемент управления, который не имеет значения.Опция Strict On, set Focus of unknown object type

Без опции Strict On, я мог бы просто иметь базовый Object и устанавливать его в зависимости от того, какой элемент управления отсутствует, а затем вызывает objMissing.Focus() в конце, но с опцией Strict On компилятор не позволяет опоздать связывание.

Я понимаю, что если элементы управления были одного типа, я мог бы, например, передать отсутствующий объект на TextBox. Есть ли способ, которым я все еще могу это сделать, используя одну переменную, чтобы сохранить элемент управления для установки фокуса? Или я должен просто установить фокус сразу в каждом из If s, которые проверяют значение?

Вот пример кода, который я смотрю (txt_ являются TextBox, cbo_ являются ComboBox, btn_ являются Button типов):

Dim objMissing as Object 

    If txtItemDescription.Text = String.Empty Then 
     objMissing = txtItemDescription 
     strMessage = "You must enter an item description." 
    ElseIf cboProductType.Text = String.Empty Then 
     objMissing = cboProductType 
     strMessage = "You must select a product type." 
    ElseIf cboComponentType.Text = String.Empty And cboComponentType.Enabled Then 
     objMissing = cboComponentType 
     strMessage = "You must select a component type." 
    ElseIf txtOnHand.Text = String.Empty Then 
     txtOnHand.Text = "0" 
    ElseIf txtRented.Text = String.Empty Then 
     txtRented.Text = "0" 
    ElseIf txtCost.Text = String.Empty Then 
     txtCost.Text = "0.00" 
    ElseIf txtFreight.Text = String.Empty Then 
     txtFreight.Text = "0.00" 
    ElseIf Len(txtBarcodePrefix.Text) < 6 Then 
     objMissing = txtBarcodePrefix 
     strMessage = "You must enter a 6-digit barcode prefix." 
    ElseIf cboCondition.Text = String.Empty Then 
     objMissing = cboCondition 
     strMessage = "You must enter a condition." 
    ElseIf btnComponents.Enabled And Me.ComponentList.Count = 0 Then 
     objMissing = btnComponents 
     strMessage = "You must select the item components." 
    ElseIf txtSerialNumber.Text <> String.Empty AndAlso txtOnHand.Text <> String.Empty Then 
     If CInt(txtOnHand.Text) > 1 Then 
      objMissing = txtOnHand 
      strMessage = "You cannot have more than 1 item on hand with the same serial number." 
     End If 
    End If 

    If objMissing IsNot Nothing Then 
     MessageBox.Show(strMessage) 
     objMissing.Focus() 
    End If 
+0

Это winform, asp.net, wpf? –

+0

Ах, извините, добавил тег winforms. –

ответ

3

Если вы объявляете objMissing как тип контроля, то ваш код будет работать как пожелаете. Все стандартные элементы управления WinForms должны унаследовать от Control.

+0

Это именно то, что я искал. Я стал слишком общим с типом «Объект», но «Контроль» сделал трюк. Спасибо. –

+3

Просто добавьте, что если это произойдет в будущем, посмотрите на иерархию объектов либо через MSDN (например, [Текстовое поле] (http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox (v = vs.110) .aspx)) или браузер объекта VS ... Следуйте за деревом, пока не найдете объект, который является общим или конкретным, как вам нужно – Basic

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