如何在加载时锁定c#,winForm中的组合框?

时间:2018-06-06 06:40:47

标签: c# winforms

我只在客户需要时加载Comboboxes。 但是,当我加载Comboboxes时,它看起来很糟糕......

代码:

 combobox1.SetBindingToLookup(dataSource);

dataSource的类型为IEnumerable<T> 当客户端点击组合框时,这个代码动作

我认为解决方法是在客户端点击它时锁定组合框,并且仅在加载完成时解锁它。

3 个答案:

答案 0 :(得分:1)

您可以使用异步方法加载数据。然后,您只需在表单的Load事件中加载数据,或者如果您希望通过调用DropDown在组合框的LoadComboBoxData()事件中延迟加载数据。

例如:

private async Task LoadComboBoxData()
{
    if (comboBox1.DataSource == null)
    {
        comboBox1.DataSource = new List<string> { "Loading ..." };
        await Task.Run(() =>
        {
            //Let's say you load items from a source and it's time consuming,
            //Just for example
            Thread.Sleep(3000);
            comboBox1.DataSource = Enumerable.Range(1, 10000)
                .Select(x => new { Name = x, Value = x }).ToList(); ;
        });
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Value";
    }
}

答案 1 :(得分:0)

根据问题的评论评论。您不希望您的combox加载表单的Load事件,也不想在线程中加载它。

基本要求是不要有闪烁效果(你点击事件本身就是你加载的组合框 - 所以组合框首先会看到空,然后加载)。

您可以做的最好的事情是更改加载组合框的事件。事件应该是在点击事件之前提升的事件,因此当用户点击它时,组合框将被加载。

让我们说MouseEnter组合框的事件。在点击它时,用户必须首先在组合框上输入鼠标,此时此事件将被提升,您可以在那里加载组合框。

如下所示:

private void combobox1_MouseEnter(object sender, EventArgs e)
{
    combobox1.Items.Clear();
    combobox1.SetBindingToLookup(dataSource);
    //for (int i = 0; i < options.Count(); i++)
    //{
    //    comboBox1.Items.Add(options[i]);
    //}
}

注意:如果用户使用悬停鼠标(即使是错误的话),也会引发此事件,但所有这些情况都将在加载表单后完成。整体表现不会影响。

其他可能的事件是DropDown事件,正如BaskarJohn在下面的评论中所建议的那样。

通过使用该事件,您可以通过两种方式加载组合框(鼠标单击和键盘交互)。

private void comboBox1_DropDown(object sender, EventArgs e)
{
    combobox1.Items.Clear();
    combobox1.SetBindingToLookup(dataSource);
}

只有你可能面对的事情,在开启dropdown

时会有点慢(正如你在问题评论中提到的那样,加载需要0.5 - 1秒)

答案 2 :(得分:0)

我有一个小方法来处理这种情况。

public partial class FormComboBoxBinding : Form
{
    DataTable dt;
    public FormComboBoxBinding()
    {
        InitializeComponent();
        comboBox1.LazyBind = LoadBind;
    }

    private void LoadBind()
    {
        if (dt == null)
        {
            dt = new DataTable();
            dt.Columns.Add("messages", typeof(string));
            dt.Columns.Add("c_id", typeof(int));

            for (int i = 0; i < 10; i++)
            {
                dt.Rows.Add("message " + i.ToString(), i);
            }
            comboBox1.DataSource = dt.DefaultView;
            comboBox1.DisplayMember = "messages";
            comboBox1.ValueMember = "c_id";
        }
    }
}

public class ComboBoxEx : ComboBox
{
    public Action LazyBind { get; set; }
    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
    }

    protected override void OnDropDown(EventArgs e)
    {
        if (LazyBind != null) LazyBind();
        base.OnDropDown(e);
    }
}

您可以自己定制。