我正在设置我的第一个组合框(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
中其他信息:在结果中找不到指定的列:
组合框的外观。
答案 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
}
}