好的,不要惩罚我,直到你完全读完为止。我知道如何根据另一个组合框的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;
}
}
然而,当我在我的新应用程序中使用它时,我总是会收到错误声明:"读取器关闭时无效的读取尝试"一旦我点击调试...然后我单击确定并加载表单,只有父组合和子组合框都没有填充。但是,如果我不使用开关或if语句并将其设置为其他方式,我可以填充它们,但我无法根据父组合框选择填充子组合框....
我在过去的4个小时里玩弄了这个,坦率地说,我的大脑是油炸的,所以我转到应用程序的另一部分......谁能告诉我为什么这不起作用?