0

好的,在您完全阅读此内容之前不要责备我。我知道如何根据另一个组合框的 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 个小时里,我一直在玩弄这个,坦率地说,我的大脑被炸了,所以我转到了应用程序的另一部分……谁能告诉我为什么这不起作用?

4

0 回答 0