我只在客户需要时加载Comboboxes。 但是,当我加载Comboboxes时,它看起来很糟糕......
代码:
combobox1.SetBindingToLookup(dataSource);
dataSource
的类型为IEnumerable<T>
当客户端点击组合框时,这个代码动作
我认为解决方法是在客户端点击它时锁定组合框,并且仅在加载完成时解锁它。
答案 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
答案 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);
}
}
您可以自己定制。