[英]How to lock combobox in c#, winForm when is loading?
我仅在客户端需要时才加载组合框。 但是当我加载组合框时,它看起来很糟糕...
编码:
combobox1.SetBindingToLookup(dataSource);
的类型的dataSource
是IEnumerable<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.