打算将System.Windows.Forms.ComboBox对象的SelectIndex设为-1表示当前不选择任何条目,实验N次失败。
    当时执行cmb.SelectIndex=-1
    跟踪观察确实SelectIndex==-1,
    但到窗体观看发现原来选择的条目内容还在显示,没有清除,此时再检查SelectIndex!=-1了,我晕,考虑半天,干脆将cmb.SelectIndex=-1;连续重写2遍,也就是连续执行2次,再到窗体观察发现OK了。我又晕!!!!     现在我的系统就这么运行着。
     大虾们怎么回事

解决方案 »

  1.   

    如果你的ComboBox设置为DropdownList,这样写是不会有问题的!!
      

  2.   

    我测试下来是没有问题的,你不是在SelectIndexChange事件做了什么,还是你的代码有问题。
      

  3.   

    cmb.SelectedItem = DBNull.Value;
    or
    cmb.SelectIndex=-1;
    Application.DoEvents();
      

  4.   

    看到了众多csdn水友发现了.net的无数bug不知道该哭还是该笑实在很疑惑,bug这个词很流行么?说了代表水平高?bugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbug
    bugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbug
    bugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbug
      

  5.   

    测试过了,没有问题。应该是楼主的代码有问题。查清楚代码再来发BUG贴嘛!
      

  6.   

    我又仔细测试过了,确实有问题,主帖描述不精确不好意思
       这次我把其他无关代码去掉了,简短代码如下可拷贝测试:再描述:ComboBox是绑定到DataTable的,
        清空以前如果显示的是第一项(SelectedIndex==0),就没有问题能正常清空
        而如果清空以前显示的是其他项(SelectedIndex>0),执行清空操作后,ComboBox显示的是第一项的内容(没有清空)。此时再清空一次(SelectedIndex=-1)就可以了。    迷惑ing,大家不吝指教    3tzjq(永不言弃) 的方法也不行!!
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    namespace GSCultivate.Cultivate
    {
    /// <summary>
    /// Form1 的摘要说明。
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    #region Windows 变量 private System.Windows.Forms.ComboBox cmbTeacher;
    #endregion private System.Windows.Forms.Button btnAdvisor;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public Form1()
    {
    InitializeComponent(); DataTable dt=new DataTable();
    dt.Columns.Add("ttt",System.Type.GetType("System.String"));
    dt.Columns.Add("vvv",System.Type.GetType("System.String"));
    dt.Rows.Add(new object[]{"aaa","111"});
    dt.Rows.Add(new object[]{"bbb","222"});
    dt.Rows.Add(new object[]{"ccc","333"});
    dt.Rows.Add(new object[]{"ddd","444"});  
    this.cmbTeacher.DataSource=dt;
    this.cmbTeacher.DisplayMember ="ttt";
    this.cmbTeacher.ValueMember="vvv" ; } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    } #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.cmbTeacher = new System.Windows.Forms.ComboBox();
    this.btnAdvisor = new System.Windows.Forms.Button();
    this.SuspendLayout();
    // 
    // cmbTeacher
    // 
    this.cmbTeacher.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
    this.cmbTeacher.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
    this.cmbTeacher.Location = new System.Drawing.Point(56, 48);
    this.cmbTeacher.Name = "cmbTeacher";
    this.cmbTeacher.Size = new System.Drawing.Size(120, 22);
    this.cmbTeacher.TabIndex = 21;
    this.cmbTeacher.SelectedIndexChanged += new System.EventHandler(this.cmbTeacher_SelectedIndexChanged);
    // 
    // btnAdvisor
    // 
    this.btnAdvisor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
    this.btnAdvisor.Location = new System.Drawing.Point(216, 48);
    this.btnAdvisor.Name = "btnAdvisor";
    this.btnAdvisor.Size = new System.Drawing.Size(88, 20);
    this.btnAdvisor.TabIndex = 69;
    this.btnAdvisor.Text = "clear";
    this.btnAdvisor.Click += new System.EventHandler(this.btnAdvisor_Click);
    // 
    // Form1
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(7, 16);
    this.ClientSize = new System.Drawing.Size(328, 182);
    this.Controls.Add(this.btnAdvisor);
    this.Controls.Add(this.cmbTeacher);
    this.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
    this.Name = "Form1";
    this.Text = "Form1";
    this.ResumeLayout(false); }
    #endregion private void cmbTeacher_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    object o=cmbTeacher.SelectedValue;
    }
    private void btnAdvisor_Click(object sender, System.EventArgs e)
    {
    //cmbTeacher.SelectedValue = DBNull.Value;

    cmbTeacher.SelectedIndex=-1; //需要连续2次才生效,也许dot.net的小bug
    //cmbTeacher.SelectedIndex=-1;
    //Application.DoEvents();
    }
    [STAThread]
    static void Main() 
    {
    Application.Run(new Form1()); 
    } }
    }
      

  7.   

    to    Richardhu(学无止境)
    补充:就是把事件cmbTeacher_SelectedIndexChanged去掉也有同样问题,应该不是这个原因
      

  8.   

    你在cmb.SelectIndex=-1;后,再把cmb.Text="";
      

  9.   

    to  fellowcheng(头都编大了) 试过了,不行!
      

  10.   

    我重新测试了一下,个人认为应该是绑定的问题,不是comboBox的问题。估计是防止出错,所以默认选择第一项,如果你想清空的话,首先应该清空绑定,或者用currencymanager的SuspendBinding挂起绑定,就可以清空了。
      

  11.   

    ((CurrencyManager)this.cmbTeacher.BindingContext[this.cmbTeacher.DataSource]).Position = -1;
    cmbTeacher.SelectedIndex=-1;我已查到了原因,你是绑定的数据所以在cmbTeacher.SelectedIndex=-1;时,他会把Position 设置为0,然后-1!=0,再激活一次selectedchanged事件,也就是说当,把cmbTeacher.SelectedIndex=-1;时会激活两次selectedchanged事件,而且把SelectedIndex设为了0,你可以按照我上面的写法来做,只激活一次selectedchanged事件,而且把数据清空了。
      

  12.   

    谢谢  Richardhu(学无止境) 
    问题虽然有方法暂时解决,但总觉得别扭既然可以     cmb.SelectedIndex=[0……n]     =>    CurrencyManager.Position==[0……n]
    那么就应该   cmb.SelectedIndex=-1   =>     CurrencyManager.Position=-1
      

  13.   

    我用反编译器查看的
    protected override void OnSelectedIndexChanged(EventArgs e)
    {
          base.OnSelectedIndexChanged(e);
          EventHandler handler1 = (EventHandler) base.Events[ComboBox.EVENT_SELECTEDINDEXCHANGED];
          if (handler1 != null)
          {
                handler1(this, e);
          }
          if ((base.DataManager != null) && (base.DataManager.Position != this.SelectedIndex))
          {
                base.DataManager.Position = this.SelectedIndex;
          }
    }和public override int Position
    {
          get
          {
                return this.listposition;
          }
          set
          {
                if (this.listposition != -1)
                {
                      if (value < 0)
                      {
                            value = 0;
                      }
                      int num1 = this.list.Count;
                      if (value >= num1)
                      {
                            value = num1 - 1;
                      }
                      this.ChangeRecordState(value, this.listposition != value, true, true, false);
                }
          }
    }
      

  14.   

    TextChanged事件的问题。你如果不想那样,就必须在修改值时,注销TextChanged事件!!!
      

  15.   

    to JasonHeung(拥有一切也只不过这样笑着哭) 请教注销方法,是继承ComboBox重写其中的保护函数OnTextChanged吗??