winform combobox清空条目

时间:2017-07-18 13:16:26

标签: c# winforms combobox backgroundworker

我遇到了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());
        }

2 个答案:

答案 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);