我遇到了WinForms-Combobox的问题。 我使用BackgroundWorker填充Box。 当我调用comboBox.Items.Clear()时,组合框的下拉列表仍然具有类似组合框中的项目的大小。但是没有文字。当我运行backgroundworker再次填充组合框时,每个项目有2个条目。当我清除列表并再次运行时,有3个,依此类推。 好像他们根本没有被清除。
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());
}
答案 0 :(得分:1)
你的问题就在这一行:
backgroundWorker.DoWork += Read;
每按一次按钮,您都会注册一个额外的活动!因此,第二次按下它时,第一个事件被触发,在它读完数据后,第二个事件(您刚刚注册)被触发并再次读取数据。这就是为什么每次点击都会将您的数据乘以点击量。
解决方案是要么在读取作业完成时再次取消注册,要么(我更喜欢)将事件注册放入Form的构造函数中,该构造函数在开始时调用一次:
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);
}
}
编辑:
对于ComboBox
的奇怪下拉长度,您可以在清除项目列表后将ComboBox.IntegralHeight属性设置为false
。这将导致小的下拉。免责声明是,在下一次填充时,它不会完全打开,而是使用滚动条。可this answer可以帮助您进一步
答案 1 :(得分:0)
我通过使用:
检查值是否已经在集合中来解决重复问题if (!myComboBox.Items.Contains(myItem))
myComboBox.Items.Add(myItem);
你可以逐个尝试:
myComboBox.Items.Remove(myItem);