繁体   English   中英

加载时如何在C#,WinForm中锁定组合框?

[英]How to lock combobox in c#, winForm when is loading?

我仅在客户端需要时才加载组合框。 但是当我加载组合框时,它看起来很糟糕...

编码:

 combobox1.SetBindingToLookup(dataSource);

的类型的dataSourceIEnumerable<T>和该代码时的动作的组合框的客户点击

我认为解决此问题的方法是在客户端单击组合框时锁定该组合框,并且仅在加载完成后才将其解锁。

您可以使用异步方法加载数据。 然后,您可以简单地在窗体的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";
    }
}

根据讨论中的评论。 您既不想在表单的Load事件上加载combox,也不想在线程中加载它。

基本要求是不具有闪烁效果(就像单击事件本身一样,您正在加载combobox-因此,combobox将首先显示为空然后再加载)。

最好的办法是更改一个加载组合框的事件。 事件应该是在单击事件之前引发的事件,因此当用户单击它时,组合框将已加载。

假设,组合框的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秒)

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

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);
    }
}

您可以自定义自己。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM