好的,在您完全阅读此内容之前不要责备我。我知道如何根据另一个组合框的 selectedindex 填充组合框,并测试了我找到的方法并且它有效。
我正在构建一个工作应用程序,并且正在尝试做比我的测试构建更多的事情,所以如果这是一个简单的修复,请原谅我......就像 3 周前一样刚学会 C#,到目前为止只制作了 1 个应用程序,它是很粗糙。
所以我的问题....我正在使用 SqlCE 来存储我的表单的基本数据。
我有一个 BaseForm 来存储我所有表单共有的变量和方法。在这个 BaseForm 中,我设置了所有 SqlCE 内容,并准备好与我的所有子表单一起使用。它们是这样设置的:
internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf");
internal SqlCeCommand command;
internal SqlCeDataReader drDataSet;
internal void openDataConnection() // Opens a connection to the data tables
{
try
{
if(dataConn.State == ConnectionState.Closed)
dataConn.Open();
}
catch(SqlCeException ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
我要做的是填充两个组合框,第一个或父框是绑定类型,它存储我们携带的绑定类型。它是这样设置的: 在 BaseForm 中:
internal void populateComboBox(string boxCommand, string itemsAdding, ComboBox comboBox) // Auto populates a combo box
{
comboBox.Items.Clear();
openDataConnection();
try
{
command = new SqlCeCommand(boxCommand, dataConn);
drDataSet = command.ExecuteReader();
while (drDataSet.Read())
{
comboBox.Items.Add(drDataSet[itemsAdding].ToString());
comboBox.SelectedIndex = 0;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
dataConn.Close();
}
}
internal void populateComboBox(string boxCommand, string itemsAdding, int typeSelector, ComboBox comboBox) // Auto populate a combo box based on another
{
comboBox.Items.Clear();
openDataConnection();
try
{
command = new SqlCeCommand(boxCommand + " WHERE TypeID = @type ORDER BY Id", dataConn);
command.Parameters.AddWithValue("@type", typeSelector);
drDataSet = command.ExecuteReader();
while (drDataSet.Read())
{
comboBox.Items.Add(drDataSet[itemsAdding].ToString());
comboBox.SelectedIndex = 0;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
dataConn.Close();
}
}
如您所见,这是两个重载方法。第一个用于填充父组合框,第二个用于填充和过滤子组合框。
现在在我的表单中,我已经设置了组合框,以便在表单构建后立即填充:
public partial class JobLog : BaseForm
{
public JobLog()
{
InitializeComponent();
jobLogSetup();
}
private void jobLogSetup() // Initially sets up the form for use
{
populateComboBox("SELECT * FROM bindtypes ORDER BY Id", "Type", comboBox3); // Populate bind type combo box
populateComboBox("SELECT * FROM bindsizes", "Size", 1, comboBox4); // Populate bind size combo box
}
}
绑定类型(父)组合框是comboBox3,绑定大小(子)组合框是comboBox4。
这很好用......因为我也必须对其他组合框集使用相同的方法。所以我的问题是:这些方法工作得很好,无论我在哪里调用它们,它们总是更新组合框......除非我尝试在 combobox_SelectedIndexChanged 事件中使用 if 语句或 switch 语句调用它们......
我之前使用并在我的第一个应用程序中使用的是一个开关,因此我在这里模仿了它:
private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{
switch (comboBox3.SelectedIndex)
{
case 0:
populateComboBox("SELECT * FROM bindsizes", "Size", 1, comboBox4);
break;
case 1:
populateComboBox("SELECT * FROM bindsizes", "Size", 2, comboBox4);
break;
case 2:
populateComboBox("SELECT * FROM bindsizes", "Size", 3, comboBox4);
break;
case 3:
populateComboBox("SELECT * FROM bindsizes", "Size", 4, comboBox4);
break;
case 4:
populateComboBox("SELECT * FROM bindsizes", "Size", 5, comboBox4);
break;
case 5:
populateComboBox("SELECT * FROM bindsizes", "Size", 6, comboBox4);
break;
}
}
但是,当我在较新的应用程序中使用它时,我总是收到一条错误消息:“关闭阅读器时尝试读取无效”,只要我点击调试...然后我单击“确定”并加载表单,既不是父级也不是子组合框已被填充。但是,如果我不使用 switch 或 if 语句而只是以其他方式设置它,我可以填充它们,但我不能让子组合框根据父组合框选择来填充....
在过去的 4 个小时里,我一直在玩弄这个,坦率地说,我的大脑被炸了,所以我转到了应用程序的另一部分……谁能告诉我为什么这不起作用?