none
Индекс и значения combobox RRS feed

  • Вопрос

  • Можно ли сделать что бы в combobox использовался дополнительный индекс (который хранит скрытое значение) у значения, которые выводиться. 

    <option value="1">item 1</option>

    Только для C# и элемента combobox.

    И можно ли сделать, что бы данные выводились из базы данных?

    Сейчас делаю так:

    string sql = "SELECT id, title FROM speciality"; SqlCommand sqlCommand = db.DoIt(sql, connection1); SqlDataReader rdr = sqlCommand.ExecuteReader(); while(rdr.Read()) {

    this.cmbbxStaffSpec.Items.Add(rdr[1].ToString());

    }


    Спасибо.

Ответы

  • Кидаете на форму ComboBox. У него в свойствах прописываете:

    ValueMember - имя столбца со значениями (я прописал столбец Value)

    DisplayMember - имя столбца для показа (я прописал Name)

    Ну и пишите вот такой код:

    public Form1()
    {
        InitializeComponent();
    
        // Вы читаете из базы, я создаю ручками
        DataTable dt = new DataTable();
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Value", typeof(int));
        dt.Rows.Add("Иван", 10);
        dt.Rows.Add("Петр", 20);
        dt.Rows.Add("Сидор", 30);
        comboBox1.DataSource = dt;
    }

    Все, пользователю показывается столбец Name, а если у ComboBox-а спосить SelectedValue, то там будет из столбца Value. Следующий код при выбранном "Петр" покажет 20:

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(comboBox1.SelectedValue.ToString());
    }

    p.s. Указывайте платформу в теме или тексте вопроса, ответ будите получать чуть быстрее...
    • Помечено в качестве ответа WebAction 17 мая 2012 г. 14:47
    Отвечающий

Все ответы

  • Добрый день.

    Если вы используете WPF, то вот так:

    <StackPanel >
        <ComboBox x:Name="cbItems" DisplayMemberPath="Text" />
        <Button Content="Show!" Click="Button_Click_1" />
    </StackPanel> 

    Код в форме, на которой это StackPanel:

    public partial class MainWindow : Window
    {
        class MyItem : DependencyObject
        {
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty TextProperty =
                DependencyProperty.Register("Text", typeof(string), typeof(MyItem), new UIPropertyMetadata(""));
    
    
    
            public int Value
            {
                get { return (int)GetValue(ValueProperty); }
                set { SetValue(ValueProperty, value); }
            }
    
            // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty ValueProperty =
                DependencyProperty.Register("Value", typeof(int), typeof(MyItem), new UIPropertyMetadata(0));
    
        }
    
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
    
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            ObservableCollection<MyItem> items = new ObservableCollection<MyItem>();
            for (int i = 0; i < 3; i++)
            {
                // Здесь у вас будет копирование из DataTable в коллекцию
                items.Add(new MyItem() { Value = i, Text = "a" + i });
            }
            cbItems.ItemsSource = items;
        }
    
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (cbItems.SelectedItem != null)
            {
                MessageBox.Show(((MyItem)cbItems.SelectedItem).Value.ToString());
            }
    
            SqlCommand thisCommand = null;
            thisCommand.Parameters.Add("@StaffAddress", typeof(string));
            thisCommand.Parameters["@StaffAddress"].Value = "ну что вы там хотите присвоить";
        }
    }

    А чтобы не заниматься преобразованиями, почитайте про Entity Framework.


    Отвечающий
  • Пока нету возможности использовать фреймворк, использую C# для Windows Forms. Может ли быть какой-то аналог?
  • Кидаете на форму ComboBox. У него в свойствах прописываете:

    ValueMember - имя столбца со значениями (я прописал столбец Value)

    DisplayMember - имя столбца для показа (я прописал Name)

    Ну и пишите вот такой код:

    public Form1()
    {
        InitializeComponent();
    
        // Вы читаете из базы, я создаю ручками
        DataTable dt = new DataTable();
        dt.Columns.Add("Name", typeof(string));
        dt.Columns.Add("Value", typeof(int));
        dt.Rows.Add("Иван", 10);
        dt.Rows.Add("Петр", 20);
        dt.Rows.Add("Сидор", 30);
        comboBox1.DataSource = dt;
    }

    Все, пользователю показывается столбец Name, а если у ComboBox-а спосить SelectedValue, то там будет из столбца Value. Следующий код при выбранном "Петр" покажет 20:

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(comboBox1.SelectedValue.ToString());
    }

    p.s. Указывайте платформу в теме или тексте вопроса, ответ будите получать чуть быстрее...
    • Помечено в качестве ответа WebAction 17 мая 2012 г. 14:47
    Отвечающий