【问题标题】:Combobox does not revert to null when value is cleared清除值时,组合框不会恢复为空
【发布时间】:2013-03-16 12:59:16
【问题描述】:

由于 .NET 中的一个缺陷(微软说这是有意的,但我认为这是一个严重的缺陷) 如果用户清空组合框(即想要清空该值),则所选值不会恢复为 null,而是保留最后一个有效的所选值,因此当您使用空白组合框保存时,它会返回原始值。一个解决方法是首先从下拉列表中选择一个不同的选项,然后将其清空,它将正常工作。但是,这不是应用程序用户所希望的。

那么有没有办法解决这个问题。或者我是否可以为“NONE”添加一个选项,然后将数据库中的值更改为 NULL。注意:Combobox 具有数据绑定功能,我无法为 Names 添加选项 none。

Form.Desginer.cs 的内容:

private void InitializeComponent()
    {
      ......
      this.cmbSecCSR = new System.Windows.Forms.ComboBox();
      this.csrBindingSource2 = new System.Windows.Forms.BindingSource(this.components);
      .....
       // 
        // pnlCSRs
        // 
        this.pnlCSRs.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        this.pnlCSRs.Controls.Add(this.cmbSecCSR);
        ......
       // 
        // cmbSecCSR
        // 
        this.cmbSecCSR.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
        this.cmbSecCSR.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
        this.cmbSecCSR.DataSource = this.csrBindingSource2;
        this.cmbSecCSR.DisplayMember = "Name";
        this.cmbSecCSR.FormattingEnabled = true;
        this.cmbSecCSR.Location = new System.Drawing.Point(112, 26);
        this.cmbSecCSR.Margin = new System.Windows.Forms.Padding(0);
        this.cmbSecCSR.Name = "cmbSecCSR";
        this.cmbSecCSR.Size = new System.Drawing.Size(184, 21);
        this.cmbSecCSR.TabIndex = 2;
        this.cmbSecCSR.ValueMember = "Username";

        this.cmbSecCSR.TextChanged += new System.EventHandler(this.comboBox_TextChanged);
        this.cmbSecCSR.Enter += new System.EventHandler(this.cmbBox_Entered);
        // 
        // csrBindingSource2
        // 
        this.csrBindingSource2.DataMember = "CSR";
        this.csrBindingSource2.DataSource = this.productionDS;
        //..............
   }

以上是与此组合框相关的点点滴滴(我只是在修复应用程序中的错误,以及 C# 中的新手。

.CS文件中与该组合框相关的内容如下:

private void loadDetails()
   {
     this.productionCrewTableAdapter.FillByProductionID(this.productionDS.ProductionCrew, productionID);
cmbSecCSR.DataBindings.Add("SelectedValue", productionMasterBindingSource, "CSR2", true, DataSourceUpdateMode.OnPropertyChanged);
}
  private void comboBox_TextChanged(object sender, EventArgs e)
    {
        ComboBox cmbx = (ComboBox)sender;
        if (cmbx.Equals(cmbCamSupplier))
        {

        }
        else if (cmbx.Equals(cmbLGSupplier))
        {

        }
        if (cmbx.Text.Length > 0) return;
        cmbx.ResetText();
        cmbx.SelectedIndex = -1;
    }

 private void cmbBox_Entered(object sender, EventArgs e)
    {
        ComboBox cmb = (ComboBox)sender;
        String txt = cmb.Text;
        if (cmb.Name.Contains("CSR"))
        {
            if (cmb != null)
            {
                ((BindingSource)cmb.DataSource).Filter = (cmbOffice.SelectedIndex > -1 ? "Office = '" + cmbOffice.SelectedValue + "' AND " : "") + "IsCSR=1 AND Status=1";
                cmb.Text = txt;
            }
        }
        else if (cmb.Name.Contains("RC"))
        {
            int department = 0;
            if (cmb != null)
            {
                if (cmb.Name.Contains("Camera"))
                    department = 2;
                else if (cmb.Name.Contains("LG"))
                    department = 3;
                else if (cmb.Name.Contains("Power"))
                    department = 4;
                ((BindingSource)cmb.DataSource).Filter = (cmbOffice.SelectedIndex > -1 ? "Office = '" + cmbOffice.SelectedValue + "' AND " : "") + "IsCSR=0 AND Status=1 AND (Department = " + department + " OR Department is null OR Department = 0)";
                cmb.Text = txt;
            }
        }
    }

如果有人可以帮助我解决我一直在努力解决的这个问题,我将非常感激。

【问题讨论】:

  • 您希望用户在组合框中输入值,还是需要一个不可编辑的下拉值列表(可能包含“none”)?
  • 那么,这是您第三次尝试这个问题了吗?终于有答案了吗?
  • 不,我没有...因此重新发布.... None 选项也不错 要么 要么

标签: c# winforms visual-studio visual-studio-2008


【解决方案1】:

同时给你的通话清算价值与

this.cmbSecCSR.Items.Clear()

你必须做一个

this.cmbSecCSR.Text = ""

this.cmbSecCSR.Text = "Default Text"

清除组合框中选定的文本。

【讨论】:

  • 我会将它放在代码中的什么位置...在 comboBox_TextChanged 函数中...??
  • 在TextChanged函数中,你必须使用:this.cmbSecCSR.Text = ""; this.cmbSecCSR.SelectedValue = null;在此之后,您的组合框结果将为 null :)
  • 我试过了......它编译并给了我一个异常错误。以及如果 cmbx.Equals(cmbSecCSR) 然后如果 cmbx.Text=""
  • 请帮忙。我已经为此苦苦挣扎了一段时间了。
  • 它说不能将类型'String'隐式转换为bool'
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2012-08-21
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多