打算将System.Windows.Forms.ComboBox对象的SelectIndex设为-1表示当前不选择任何条目,实验N次失败。
当时执行cmb.SelectIndex=-1
跟踪观察确实SelectIndex==-1,
但到窗体观看发现原来选择的条目内容还在显示,没有清除,此时再检查SelectIndex!=-1了,我晕,考虑半天,干脆将cmb.SelectIndex=-1;连续重写2遍,也就是连续执行2次,再到窗体观察发现OK了。我又晕!!!! 现在我的系统就这么运行着。
大虾们怎么回事
当时执行cmb.SelectIndex=-1
跟踪观察确实SelectIndex==-1,
但到窗体观看发现原来选择的条目内容还在显示,没有清除,此时再检查SelectIndex!=-1了,我晕,考虑半天,干脆将cmb.SelectIndex=-1;连续重写2遍,也就是连续执行2次,再到窗体观察发现OK了。我又晕!!!! 现在我的系统就这么运行着。
大虾们怎么回事
or
cmb.SelectIndex=-1;
Application.DoEvents();
bugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbug
bugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbugbug
这次我把其他无关代码去掉了,简短代码如下可拷贝测试:再描述: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());
} }
}
补充:就是把事件cmbTeacher_SelectedIndexChanged去掉也有同样问题,应该不是这个原因
cmbTeacher.SelectedIndex=-1;我已查到了原因,你是绑定的数据所以在cmbTeacher.SelectedIndex=-1;时,他会把Position 设置为0,然后-1!=0,再激活一次selectedchanged事件,也就是说当,把cmbTeacher.SelectedIndex=-1;时会激活两次selectedchanged事件,而且把SelectedIndex设为了0,你可以按照我上面的写法来做,只激活一次selectedchanged事件,而且把数据清空了。
问题虽然有方法暂时解决,但总觉得别扭既然可以 cmb.SelectedIndex=[0……n] => CurrencyManager.Position==[0……n]
那么就应该 cmb.SelectedIndex=-1 => CurrencyManager.Position=-1
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);
}
}
}