2010-10-30 4 views
1

Привет Я использую следующий код для запуска частной функции. У меня есть два значения в моем поле со списком: одна и две и две частные функции с одинаковыми именами, Private Sub One() и Private Sub Two()Использование частной функции

Я хочу, чтобы мое приложение вызывало функцию независимо от того, в поле со списком. Если в поле со списком выбрано «Один», следует вызвать Частную функцию. Благодаря код ниже, что не работает

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Dim vrValue = ComboBox1.Items(1) 

    Call vrValue()' In this case vrValue is Two, so Two() should be called. 
End Sub 
Private Sub two() 
    MsgBox("Function called") 
End Sub 
+1

Вы не * хотите * делать 'eval()'. В самом деле. Просто делайте это правильно. – delnan

ответ

1

Сделайте свои функции подлодки (единственное отличие заключается в возвращении значения) и поместить их в своем собственном классе :

Public Class RunFunctions 
    Dim oMessageBox As MessageBox 
    Public Function One() As String 
     'oMessageBox = MessageBox 
     Return "Message One" 

    End Function 

    Public Function Two() As String 
     Return "Message Two" 

    End Function 
End Class 

Добавить Каждую функцию из класса в качестве элемента в вашем поле со списком:

Public Class Combo_Functions 
    Dim oRunFunction As RunFunctions 
    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object _ 
      , ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 
     MessageBox.Show(ComboBox1.Items(ComboBox1.SelectedIndex())) 

    End Sub 

    Private Sub Combo_Functions_Load(ByVal sender As Object _ 
             , ByVal e As System.EventArgs) Handles Me.Load 
     oRunFunction = New RunFunctions 

     ComboBox1.Items.Add(oRunFunction.One()) 
     ComboBox1.Items.Add(oRunFunction.Two()) 

    End Sub 
End Class 

Когда поле со списком изменено (или используется код для нажатия кнопки), выдается сообщение для правильной функции.

+0

Дает ошибку Ссылка на не общего пользователя требует ссылки на объект, в то время как я поместил combobox1 в форму –

+0

Убедитесь, что вы исключили код: «Public Class Combo_Functions» и используйте код в своей форме. – JeffO

0
Dim vrValue = ComboBox1.SelectedItem.ToString() 

Select vrValue 
    Case "One" 
     One() 
    Else 
     Two() 
End Select 
+0

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

+0

Когда пользователь выбирает элемент в ComboBox, вызывается SelectedIndexChanged и SelectedValueChanged, и вы можете проверить выбранный элемент и вызвать любую функцию, но вызвать функцию сразу после выбора элемента. Я не думаю, что есть способ сделать это. но для получения контроля ComboBox и ComboBoxItem, обработайте SelectedIndexChanged внутри и вызовите функцию, связанную с производным ComboBoxItem. В любом случае, я хотел бы видеть мнение других людей, это интересный вопрос. –

-1

Похоже, что вы пытаетесь динамически вызвать конкретный метод, используя строковую переменную, содержащую ее имя. Например, поле со списком будет содержать элементы «Один» и «Два», и вы должны называть подменю «Один», если выбран первый элемент в поле со списком или подназвание «Два», если второй элемент выбран. С этой целью вы можете найти эту статью интересно:

http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx

Код в этой статье в C#, который не должен быть слишком трудно преобразовать в VB. Но вот переведенная версия кода для простого вызова метода без передачи или возврата каких-либо параметров (примечание: я не тестировал этот код). Он просто использует отражение найти подходящий метод:

Public Shared Sub InvokeStringMethod(ByVal typeName As String, ByVal methodName As String) 
    'Get the type of the class 
    Dim calledType As Type = Type.[GetType](typeName) 

    'Invoke the method itself 
    calledType.InvokeMember(methodName, BindingFlags.InvokeMethod Or BindingFlags.[Public] Or BindingFlags.[Static], Nothing, Nothing, Nothing) 
End Sub 

Вы просто передать имя класса, который содержит метод (ы) вы хотите позвонить, как typeName и название самого метода, который вы хотите звоните как methodName:

InvokeStringMethod("MyClass", "Two") 
+0

Спасибо, я попробовал код, который он дает ошибку. BindingFlags не объявлен. Не могли бы вы проверить его для меня, пожалуйста? –

+0

У вас должна быть строка «Imports System.Reflection» в самом верху вашего файла кода. В системе объявляется «BindingFlags».Reflection namespace, и это говорит компилятору, чтобы посмотреть там. –

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