Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# winform组合框清除空条目_C#_Winforms_Combobox_Backgroundworker - Fatal编程技术网

C# winform组合框清除空条目

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

我对WinForms组合框有问题。 我用一个BackgroundWorker填充这个框。 调用comboBox.Items.Clear()时,comboBox的dropdownlist的大小仍然与comboBox中的项目相同。但是没有文本。当我再次运行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());
        }
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不是真的,请查看我的编辑和我发布的链接