Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зависимые ComboBox, WinForms, MSSQL 
:(
    Опции темы
Qwe2
Дата 11.10.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Есть WinForms-приложение: на форме 2 ComboBox'а, данные в них должны браться из MSSQL. При выборе значения из первого ComboBox'а, во втором должен оказаться список значений из связанной таблицы БД ("Тип" - "Подтип"). Вопросов три:
1) почему в начале второй комбобокс не заполняется?
2) почему возникает ошибка при выборе значения из первого комбобокса (при чем пару раз можно повыбирать и значения во втором автоматом меняются) "System.ArgumentException: Items collection cannot be modified when the DataSource property is set."?
3) стоит ли при каждом выборе подключаться к БД или лучше держать соединение?

Код

using System;
using System.Data;
using System.Windows.Forms;
using System.Configuration;
using System.Data.SqlClient;
using System.Drawing;
 
namespace combobox_test
{    
    class combo1
    {        
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    //
    public partial class Form1 : Form
    {
        string sConn = "...";

        ComboBox cbType;
        ComboBox cbSubType;

        //
        public Form1()
        {
            InitializeComponent();
            FillType();
            cbType.SelectedIndex = 0;        
        }

        // Тип
        void FillType()
        {            
            using (SqlConnection conn = new SqlConnection(sConn))
            {
                try
                {                    
                    SqlDataAdapter da = new SqlDataAdapter("Select ID, Name From scb_type Order By ID", conn);
                    DataSet ds = new DataSet();
                    conn.Open();
                    da.Fill(ds);
                    conn.Close();

                    cbType.DataSource = ds.Tables[0];
                    cbType.DisplayMember = "Name";
                    cbType.ValueMember = "ID";
                }
                catch (SqlException se)
                {
                    MessageBox.Show(se.Message);
                    return;
                }
            }
        }

        // Подтип
        void FillSubType(string id)
        {
            using (SqlConnection conn = new SqlConnection(sConn))
            {
                try
                {                    
                    SqlDataAdapter da = new SqlDataAdapter("Select ID, Name From scb_subtype Where ID_P = " + id, conn);
                    DataSet ds = new DataSet();
                    conn.Open();
                    da.Fill(ds);
                    conn.Close();

                    cbSubType.Items.Clear();
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        cbSubType.DataSource = ds.Tables[0];
                        cbSubType.DisplayMember = "Name";
                        cbSubType.ValueMember = "ID";
                        cbSubType.SelectedIndex = 0;
                    }
                }
                catch (SqlException se)
                {
                    MessageBox.Show(se.Message);
                    return;
                }
            }
        }

        //
        void InitializeComponent()
        {                       
            cbType = new ComboBox();
            cbSubType = new ComboBox();
            //
            // form
            //
            this.MinimumSize = new Size(580, 435);
            this.Text = "";
            this.FormBorderStyle = FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.StartPosition = FormStartPosition.CenterScreen;
            this.AutoScaleMode = AutoScaleMode.Font;
            //
            // cbType
            //
            cbType.Location = new Point(120, 45);
            cbType.Width = 420;
            cbType.DropDownStyle = ComboBoxStyle.DropDownList;            
            cbType.SelectedIndexChanged += (object sender, EventArgs e) =>
            {
                int i = Convert.ToInt32(cbType.SelectedValue.ToString());
                FillSubType(i.ToString());                
            };            
            //
            // cbSubType
            //
            cbSubType.Location = new Point(120, 75);
            cbSubType.Width = 420;
            cbSubType.DropDownStyle = ComboBoxStyle.DropDownList;
            //
            // form (end)
            //
            this.Controls.AddRange(new Control[] { cbType, cbSubType });
            this.ResumeLayout();
        }
    }
}


Это сообщение отредактировал(а) Qwe2 - 11.10.2013, 11:53
PM MAIL   Вверх
jonie
Дата 14.10.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 8
Всего: 118



1) потому что событие SelectedIndexChanged не срабатывает, т.к. контрол еще не инициализирован (посмотрите сами свойство Created). Я вообще не уверен что это событие будет возбуждаться при присвоении индекса (хотя вроде бы должно).

2)
Код

cbSubType.Items.Clear();
делать не надо. Вы меняете DataSource же напрямик (ссылку на DataSource  если быть точнее).


3) подключайтесь и отключайтесь - соединения пулятся и реально закрываются по таймауту бездействия (обычно).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.