2014-10-22 3 views
0

Привет Я хотел бы создать динамическую универсальную функцию ввода, которая позволяет пользователю выбирать вход из списка входов, а затем возвращать это. Для списка элементов я хочу использовать словарь.C# Общая функция словаря

Для декларации я думал вдоль линий следующее:

public static DialogResult InputBox<KeyType, ValueType>(string aTitle, string aPromptText, Dictionary<KeyType, ValueType> aDictionary, ref KeyValuePair<KeyType, ValueType> aReturnPair) 

У меня уже есть две аналогичные функции, один для даты и один для строк.

Но я хочу знать, что словарь возможен? Как мне обрабатывать кастинг? Должен ли я передавать тип ключа и значение, или я могу получить его во время выполнения?

также можно указать функцию «» использовать для извлечения имени использовать для отображения Например, у меня есть следующая структура:

public struct Person 
{ 
    public int Age; 
    public string Name; 
    public string Surname; 
} 

Как я могу сказать функции использовать Person.Surname для показа?

Пример использования:

Dictionary<int, Person> Persons = new Dictionary<int,Person>(); 
KeyValuePair<int, Person> lPair= new KeyValuePair<int,Person> 
DialogResult dialogResult = DialogResult.Cancel 
While (dialogResult == DialogResult.Cancel) 
{ 
    dialogResult = CustomForm.InputBox<int, Person>("title", "prompt", Persons, ref lPair, Person.Surname); 
} 

функция ввода Строка

public static DialogResult InputBox(string aTitle, string aPromptText, ref string aValue, Boolean aPassword = false) 
    { 
     Form lForm = new Form(); 
     Label lLabel = new Label(); 
     TextBox lTextBox = new TextBox(); 
     Button lButtonOk = new Button(); 
     Button lButtonCancel = new Button(); 

     lForm.Text = aTitle; 
     lLabel.Text = aPromptText; 
     lTextBox.Text = aValue; 

     if (aPassword) 
     { 
      lTextBox.PasswordChar = '*'; 
     } 
     lButtonOk.Text = "OK"; 
     lButtonCancel.Text = "Cancel"; 
     lButtonOk.DialogResult = DialogResult.OK; 
     lButtonCancel.DialogResult = DialogResult.Cancel; 

     lLabel.SetBounds(9, 20, 372, 13); 
     lTextBox.SetBounds(12, 36, 372, 20); 
     lButtonOk.SetBounds(228, 72, 75, 23); 
     lButtonCancel.SetBounds(309, 72, 75, 23); 

     lLabel.AutoSize = true; 
     lTextBox.Anchor = lTextBox.Anchor | AnchorStyles.Right; 
     lButtonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 
     lButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 

     lForm.ClientSize = new Size(396, 107); 
     lForm.Controls.AddRange(new Control[] { lLabel, lTextBox, lButtonOk, lButtonCancel }); 
     lForm.ClientSize = new Size(Math.Max(300, lLabel.Right + 10), lForm.ClientSize.Height); 
     lForm.FormBorderStyle = FormBorderStyle.FixedDialog; 
     lForm.StartPosition = FormStartPosition.CenterScreen; 
     lForm.MinimizeBox = false; 
     lForm.MaximizeBox = false; 
     lForm.AcceptButton = lButtonOk; 
     lForm.CancelButton = lButtonCancel; 

     DialogResult dialogResult = lForm.ShowDialog(); 
     aValue = lTextBox.Text; 
     return dialogResult; 
    } 
+0

Где вы должны использовать словарь? –

+0

Идея состоит в том, чтобы иметь переопределение строковой функции, только для словаря. Я хочу, чтобы дать функции словарь, а затем он предложит пользователю раздел. Это для библиотеки, которую я создаю для использования во всех наших приложениях. Вот почему я хочу ключ и значение динамическое – blackwolfsa

+0

Пожалуйста, проверьте мои изменения –

ответ

0

мне удалось создать Вот завершенная функция

public static DialogResult InputBox<KeyType, ValueType>(string aTitle, string aPromptText, Dictionary<KeyType, ValueType> aDictionary, ref KeyValuePair<KeyType, ValueType> aReturnPair, Func<ValueType, string> aDelegate) 
    { 
     Form lForm = new Form(); 
     Label lLabel = new Label(); 
     ComboBox lComboBox = new ComboBox(); 
     Button lButtonOk = new Button(); 
     Button lButtonCancel = new Button(); 

     lForm.Text = aTitle; 
     lLabel.Text = aPromptText; 
     foreach (KeyValuePair<KeyType, ValueType> lPair in aDictionary) 
     { 
      lComboBox.Items.Add(aDelegate(lPair.Value)); 
     } 


     lButtonOk.Text = "OK"; 
     lButtonCancel.Text = "Cancel"; 
     lButtonOk.DialogResult = DialogResult.OK; 
     lButtonCancel.DialogResult = DialogResult.Cancel; 

     lLabel.SetBounds(9, 20, 372, 13); 
     lComboBox.SetBounds(12, 36, 372, 20); 
     lButtonOk.SetBounds(228, 72, 75, 23); 
     lButtonCancel.SetBounds(309, 72, 75, 23); 

     lLabel.AutoSize = true; 
     lComboBox.Anchor = lComboBox.Anchor | AnchorStyles.Right; 
     lButtonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 
     lButtonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; 

     lForm.ClientSize = new Size(396, 107); 
     lForm.Controls.AddRange(new Control[] { lLabel, lComboBox, lButtonOk, lButtonCancel }); 
     lForm.ClientSize = new Size(Math.Max(300, lLabel.Right + 10), lForm.ClientSize.Height); 
     lForm.FormBorderStyle = FormBorderStyle.FixedDialog; 
     lForm.StartPosition = FormStartPosition.CenterScreen; 
     lForm.MinimizeBox = false; 
     lForm.MaximizeBox = false; 
     lForm.AcceptButton = lButtonOk; 
     lForm.CancelButton = lButtonCancel; 

     DialogResult dialogResult = lForm.ShowDialog(); 
     if ((dialogResult == DialogResult.OK) && (lComboBox.SelectedIndex > -1) && (lComboBox.SelectedIndex < aDictionary.Count)) 
     { 
      foreach (KeyValuePair<KeyType, ValueType> lPair in aDictionary) 
      { 
       if (string.Compare(aDelegate(lPair.Value),lComboBox.Items[lComboBox.SelectedIndex].ToString())== 0) 
       { 
        aReturnPair = lPair; 
       } 
      } 

     }    
     return dialogResult; 
    } 

Вы называете это следующим образом:

DialogResult dialogResult = CustomForm.InputBox<int, Person>("title", "prompt", Persons, ref lPair, (Person) => Person.Name); 
+0

Да, что-то вроде этого вам нужно использовать Func для его решения, пожалуйста, если вы найдете мой ответ правильно, отметьте его как ответ :) –

2

Вы можете использовать делегаты функции, которые принимают словарь в качестве параметра и возвращает строку пользователю, что-то вроде этого:

Func<Dictionary<Object, Object>,string> userOutput 

Добавляя этот параметр к функции, вы можете написать логику литья и как вы хотите подсказывать выход к пользователю, вы называете это так:

txtTextBox.Text = userOutput(dictionary); 
+0

Я не понимаю, что вы имеете в виду. Я хочу сделать то же самое, что и моя функция ввода строк. Я прикреплял его к основному сообщению. – blackwolfsa

+0

mmm Теперь я вижу, что вы имеете в виду спасибо. Но как я могу сделать объявление, если я хочу назвать его следующим: Person.Surname Это пример с исходным сообщением. – blackwolfsa

+0

Я добавил пример, как я хочу его использовать – blackwolfsa

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