Как заблокировать combobox в c #, winForm при загрузке? - PullRequest
0 голосов
/ 06 июня 2018

Я загружаю Combobox, только когда они нужны клиенту.Но когда я загружаю Combobox, он выглядит плохо ...

Код:

 combobox1.SetBindingToLookup(dataSource);

Тип dataSource равен IEnumerable<T>, и это действие кода, когда клиент нажимаетв поле со списком

Я думаю, что решение для этого состоит в том, чтобы заблокировать поле со списком, когда клиент нажимает на него, и только при окончании загрузки, чтобы разблокировать его.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

У меня есть небольшой подход, чтобы справиться с этой ситуацией.

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

Вы можете настроить себя.

0 голосов
/ 06 июня 2018

Вы можете загрузить данные в асинхронном методе.Затем вы можете просто загрузить данные в 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";
    }
}
0 голосов
/ 06 июня 2018

Согласно обсуждению в комментарии к вопросу.Вы не хотите, чтобы ваш combox загружался при событии Load формы, и вы также не хотите загружать его в потоке.

И основное требование не должно иметь эффекта мерцания (который вы имеете, как и при самом событии click, которым вы являетесьзагрузка комбобокса - поэтому комбобокс сначала будет виден пустым, а затем загружен).

Лучшее, что вы можете сделать, это изменить событие, когда вы загружаете свой комбобокс.Событие должно быть таким, которое возникает перед событием щелчка, поэтому, когда пользователь щелкает по нему, выпадающий список будет загружен.

скажем, 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);
}

Единственное, с чем вы можете столкнуться, это будет немного медленным (как вы упомянули в комментариях вопроса, что загрузка занимает 0,5 - 1 секунды) при открытии dropdown

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...