C#:基于Another填充Combobox

时间:2013-06-28 19:01:41

标签: c# winforms combobox

好的,不要惩罚我,直到你完全读完为止。我知道如何根据另一个组合框的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个小时里玩弄了这个,坦率地说,我的大脑是油炸的,所以我转到应用程序的另一部分......谁能告诉我为什么这不起作用?

0 个答案:

没有答案