【问题标题】:populate combobox depending on another combobox根据另一个组合框填充组合框
【发布时间】:2015-08-19 06:49:05
【问题描述】:

我正在制作一个 wpf,其中一个组合框根据另一个组合框填充。但是,只填充了一个组合框。

这是我下面的代码。

 public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
            this.Load += Form4_Load;
        }

        string connstring = ("Server=localhost;Port=5432;User Id=postgres;Password=021393;Database=postgres;");

        private void Form4_Load(object sender, EventArgs e)
        {
            string query = "SELECT * FROM data_organsystem";            
            fillCombo(comboBox3, query, "name", "id");
            comboBox3_SelectedIndexChanged(null, null);
        }

        private void fillCombo(ComboBox combo, string query, string displayMember, string valueMember)
        {
            NpgsqlConnection conn = new NpgsqlConnection(connstring);
            NpgsqlCommand cmd = new NpgsqlCommand(query, conn);
            NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            combo.DataSource = dt;             
            combo.DisplayMember = displayMember;            
            combo.ValueMember = valueMember;
        }

        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            int val;
            Int32.TryParse(comboBox3.SelectedValue.ToString(), out val);
            string query = "SELECT * FROM data_symptom WHERE organ_system_id = " + val;
            fillCombo(comboBox4, query, "name", "id");
        }
    }
}

如果您对如何编辑此代码有任何想法,那将是一个很大的帮助。谢谢!

【问题讨论】:

  • 你有什么错误吗?
  • 其实没有。代码运行。但只有一个组合框填充
  • 你确定你的查询返回了什么?
  • 我担心comboBox3.SelectedValue.ToString() 会抛出异常,因为comboBox3.SelectedValuenull。至少在comboBox3_SelectedIndexChanged 方法的第一次执行中。 ComboBox.SelectedValue 如果未选择任何内容,则返回 null。也许你可以使用ComboBox.SelectedValueChanged event
  • 是的。您对@Shaharyar 的工作原理有其他想法吗?

标签: c# winforms combobox


【解决方案1】:

当你在行执行comboBox3_SelectedIndexChanged方法时会报错

Int32.TryParse(comboBox3.SelectedValue.ToString(), out val);

因为comboBox3.SelectedValuenull,如果ComboBox 中没有选择项目,我没有在您的代码中看到您在第一次调用comboBox3_SelectedIndexChanged 之前选择了一些项目。

因为在Form.Load 事件处理程序异常中执行的方法comboBox3_SelectedIndexChanged 未显示。检查这个:https://stackoverflow.com/a/3209813/1565525.
这就是为什么您没有收到任何错误

您需要在使用之前检查SelectedValue 是否有null

If(this.comboBox3.SelectedValue is null)
{
    this.comboBox4.DataSource = null; //Remove all items if nothing selected
}
else
{
    Int32 val= (Int32)this.ComboBox3.SelectedValue;
    string query = "SELECT id, name FROM data_symptom WHERE organ_system_id = " + val;
    fillCombo(this.comboBox4, query, "name", "id");
 }

因为您在用项目填充 ComboBox 时使用 DataBinding,所以在逻辑上使用 SelectedValueChanged 事件处理程序

private void comboBox3_SelectedValueChanged(object sender, EventsArgs e)
{
    //same code
}

【讨论】:

  • 我应该替换空值还是将其保留为开闭括号?
  • 使用前需要检查 SelectedValue 是否为空
【解决方案2】:

您永远不会将 comboBox4 添加到表单中。 comboBox3 是通过构造函数添加的,但是comboBox4 是创建并添加到任何地方。

【讨论】:

  • 他在comboBox3_SelectedIndexChanged事件处理程序中这样做
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多