Есть 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(); } } }
|
|