【问题标题】:winform combobox clear empty entrieswinform 组合框清除空条目
【发布时间】:2017-07-18 13:16:26
【问题描述】:

我的 WinForms 组合框有问题。 我用 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());
        }

【问题讨论】:

    标签: c# winforms combobox backgroundworker


    【解决方案1】:

    你的问题是这一行:

    backgroundWorker.DoWork += Read;
    

    每次按下按钮,您都会注册一个额外的事件!所以第二次按下它时,第一个事件被触发,在它完成读取数据后,第二个事件(你刚刚注册)被触发并再次读取数据。这就是为什么每次点击时您的数据都会乘以点击次数的原因。

    解决方案是在阅读作业完成后再次取消注册,或者(我更愿意)将事件注册放入表单的构造函数中,该构造函数在开始时调用一次:

    public Form1()
    {
        InitializeComponent();
    
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.DoWork += Read;
        backgroundWorker.ProgressChanged += Populate;
        backgroundWorker.RunWorkerCompleted += Finish;
    }
    

    在按钮点击事件中只保留SqlConnectionStringBuilderRunWorkerAsync 的调用行:

    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可以帮助你进一步

    【讨论】:

    • 没错。谢谢你!最后一个问题我无法解释。当我调用 comboBox.Items.Clear() 并再次打开组合框时。下拉列表与其中的所有项目一样高(但没有项目)。清除物品后是否需要手动调整高度?
    • @Olli 不是真的,看看我的编辑和我发布的链接
    【解决方案2】:

    我通过检查值是否已经在集合中解决了重复的问题:

    if (!myComboBox.Items.Contains(myItem))
         myComboBox.Items.Add(myItem);
    

    顺便说一句,你可以一一尝试:

    myComboBox.Items.Remove(myItem);
    

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多