ComboBox选择返回IndexOutofBounds错误

时间:2014-04-14 12:24:04

标签: c# wpf xaml

我正在设置我的第一个组合框(name = combo3)的选择决定了第二个组合框(name = combo4)将显示的内容。这很好用。

现在我试图让第二个组合框确定我的第三个组合框将显示什么。这不起作用。我在第二个combox上做出选择时,它会卡住并返回错误。但是,如果我硬编码第二个组合框的值,它就可以工作。

我收到indexoutofbounds异常。问题似乎是使用方法private void ComboBox_SelectionChanged2()。请指出什么是错的。谢谢。

主窗口

string[] tableArray = { "Agent_Name", "Agent_Age", "Agent_Gender", "Agent_Alias", "Security_Clearance", "Dept_ID", "Job_ID", "Mission_ID" };
string[] attributeArray = { "Mission_Name", "Mission_Description", "Mission_Country", "Mission_City" };

private void ComboBox_SelectionChanged1(object sender, SelectionChangedEventArgs e)  
        {
            if (((ComboBoxItem)combo3.SelectedItem).Content.ToString() == "Agents")
            {
                combo4.Items.Clear();
                foreach (string x in tableArray)
                {
                    combo4.Items.Add(x);
                }
            }
            else
            {
                combo4.Items.Clear();
                foreach (string x in attributeArray)
                {
                    combo4.Items.Add(x);
                }
            }
        }

private void ComboBox_SelectionChanged2(object sender, SelectionChangedEventArgs e)
        {
            combo5.Items.Clear();
            MessageBox.Show(combo4.Text); //debugging line returns empty which shouldn't be the case. I chose Mission_Name thus it should show Mission_Name. 
            //fillCombo("SELECT * FROM " + combo3.Text + ";", "Mission_Name", combo5); //works   
            fillCombo("SELECT * FROM " + combo3.Text + ";", combo4.Text, combo5); // not working
        } 

private void fillCombo(string query, string name, ComboBox c)
        {
            MySqlCommand cmdReader = new MySqlCommand(query, conn);
            MySqlDataReader myReader;

            myReader = cmdReader.ExecuteReader();

            while (myReader.Read())
            {
                string temp = myReader.GetString(name);
                c.Items.Add(temp);
            }
            myReader.Close();
        }

XAML:

<ComboBox x:Name="combo3" Width="120" SelectionChanged="ComboBox_SelectionChanged1">
                <ComboBoxItem x:Name="box3" Content="Agents"/>
                <ComboBoxItem x:Name="box4" Content="Missions"/>
            </ComboBox>
            <ComboBox x:Name="combo4" Width="120" SelectionChanged="ComboBox_SelectionChanged2">
            </ComboBox>
<ComboBox x:Name="combo5" Width="120" Canvas.Left="818" Canvas.Top="588"/>

错误讯息:

  

“System.IndexOutOfRangeException”类型的未处理异常   发生在MySql.Data.dll

中      

其他信息:在结果中找不到指定的列:

组合框的外观。

enter image description here

3 个答案:

答案 0 :(得分:1)

替换此

MessageBox.Show(combo4.Text);

有了这个:

MessageBox.Show(combo4.SelectedText);

或者用这个:

MessageBox.Show(combo4.SelectedItem.ToString());

替换你使用combo4.Text的所有地方以及combo1 2 3等等

答案 1 :(得分:0)

正如我在评论中所说,生成用于查询该数据库的字符串存在问题。

尝试调试应用程序并为combobox4.Text属性设置断点并查看它生成的内容。

答案 2 :(得分:0)

问题是您使用ComboBox_SelectionChanged2事件运行代码来填写组合框,但是您没有验证组合框在运行代码之前已经做出选择。在组合框上绘制组合框时,将触发此事件,而在某些其他组合框中未选择任何值。您只需要在事件中添加一个条件,以确保您的组合框在尝试访问它们之前具有值。

private void ComboBox_SelectionChanged2(object sender, SelectionChangedEventArgs e)
    {
        if (combo3.Text.Length > 0 && combo4.Text.Length > 0)
        {
           combo5.Items.Clear();
           MessageBox.Show(combo4.Text); //debugging line returns empty which shouldn't be the case. I chose Mission_Name thus it should show Mission_Name. 
           //fillCombo("SELECT * FROM " + combo3.Text + ";", "Mission_Name", combo5); //works   
           fillCombo("SELECT * FROM " + combo3.Text + ";", combo4.Text, combo5); // not working
        }
    }