C# winform组合框清除空条目
我对WinForms组合框有问题。 我用一个BackgroundWorker填充这个框。 调用comboBox.Items.Clear()时,comboBox的dropdownlist的大小仍然与comboBox中的项目相同。但是没有文本。当我再次运行backgroundworker填充组合框时,每个项目有2个条目。当我清除列表并再次运行时,有3个,以此类推。 看起来他们一点也不清楚C# winform组合框清除空条目,c#,winforms,combobox,backgroundworker,C#,Winforms,Combobox,Backgroundworker,我对WinForms组合框有问题。 我用一个BackgroundWorker填充这个框。 调用comboBox.Items.Clear()时,comboBox的dropdownlist的大小仍然与comboBox中的项目相同。但是没有文本。当我再次运行backgroundworker填充组合框时,每个项目有2个条目。当我清除列表并再次运行时,有3个,以此类推。 看起来他们一点也不清楚 private void buttonConnect_Click(object sender, EventArg
private void buttonConnect_Click(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
{
var sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
sqlConnectionStringBuilder.DataSource = textBoxDataSource.Text;
sqlConnectionStringBuilder.UserID = textBoxUserId.Text;
sqlConnectionStringBuilder.Password = textBoxPassword.Text;
sqlConnectionStringBuilder.InitialCatalog = textBoxInitialCatalog.Text;
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += Read;
backgroundWorker.ProgressChanged += Populate;
backgroundWorker.RunWorkerCompleted += Finish;
backgroundWorker.RunWorkerAsync(sqlConnectionStringBuilder);
}
}
private void Read(object sender, DoWorkEventArgs e)
{
var sqlConnectionStringBuilder = e.Argument as SqlConnectionStringBuilder;
using (var context = new HadesContext(sqlConnectionStringBuilder.ConnectionString))
{
var items = context.Items.ToList();
for (int i = 0; i < items.Count; i++)
backgroundWorker.ReportProgress(0, items[i].Name}
}
}
private void Populate(object sender, ProgressChangedEventArgs e)
{
progressBarProgress.Value = e.ProgressPercentage;
comboBoxItems.Items.Add(e.UserState.ToString());
}
private void按钮连接\单击(对象发送者,事件参数e)
{
如果(!backgroundWorker.IsBusy)
{
var sqlConnectionStringBuilder=new sqlConnectionStringBuilder();
sqlConnectionStringBuilder.DataSource=textBoxDataSource.Text;
sqlConnectionStringBuilder.UserID=textBoxUserId.Text;
sqlConnectionStringBuilder.Password=textBoxPassword.Text;
sqlConnectionStringBuilder.InitialCatalog=textBoxInitialCatalog.Text;
backgroundWorker.WorkerReportsProgress=true;
backgroundWorker.DoWork+=读取;
backgroundWorker.ProgressChanged+=填充;
backgroundWorker.RunWorkerCompleted+=完成;
backgroundWorker.RunWorkerAsync(sqlConnectionStringBuilder);
}
}
私有无效读取(对象发送方,DoWorkEventArgs e)
{
var sqlConnectionStringBuilder=e。参数为sqlConnectionStringBuilder;
使用(var context=newhadescontext(sqlConnectionStringBuilder.ConnectionString))
{
var items=context.items.ToList();
对于(int i=0;i
我通过使用以下方法检查值是否已存在于集合中,从而解决了重复问题:
if (!myComboBox.Items.Contains(myItem))
myComboBox.Items.Add(myItem);
顺便说一句,您可以逐一尝试:
myComboBox.Items.Remove(myItem);
您的问题是这一行:
backgroundWorker.DoWork += Read;
每次按下按钮都会注册一个额外的事件!因此,第二次按下按钮时,会触发第一个事件,在它读取完数据后,会触发第二个事件(您刚刚注册的事件)并再次读取数据。这就是为什么每次单击时,您的数据都会乘以您的单击次数
解决方案可能是在读取作业完成时再次注销它,或者(我更愿意)将事件注册放入表单的构造函数中,该构造函数在开始时调用一次:
public Form1()
{
InitializeComponent();
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.DoWork += Read;
backgroundWorker.ProgressChanged += Populate;
backgroundWorker.RunWorkerCompleted += Finish;
}
只保留按钮单击事件中SqlConnectionStringBuilder
和RunWorkerAsync
调用的行:
private void buttonConnect_Click(object sender, EventArgs e)
{
if (!backgroundWorker.IsBusy)
{
var sqlConnectionStringBuilder = new SqlConnectionStringBuilder();
sqlConnectionStringBuilder.DataSource = textBoxDataSource.Text;
sqlConnectionStringBuilder.UserID = textBoxUserId.Text;
sqlConnectionStringBuilder.Password = textBoxPassword.Text;
sqlConnectionStringBuilder.InitialCatalog = textBoxInitialCatalog.Text;
backgroundWorker.RunWorkerAsync(sqlConnectionStringBuilder);
}
}
编辑:
至于
组合框的奇怪下拉长度
,您可以在清除项目列表后将属性设置为false
。这将导致较小的下拉列表。免责声明是,在下次填充时,它不会完全打开,而是使用滚动条。这可能有助于进一步这是正确的。谢谢!有一个last问题,我无法解释。当我调用comboBox.Items.Clear()并再次打开comboBox时。dropdownlist与其中所有项目的高度一样高(但没有项目)。在清除项目后,我必须手动调整高度吗?@Olli不是真的,请查看我的编辑和我发布的链接