C # ComboBox краска замерзает - PullRequest
0 голосов
/ 05 сентября 2018

У меня довольно большое (4700 строк) приложение Windows Forms, которое я написал для координации трех отделов на моем производственном предприятии. У меня есть много полей со списком во всем приложении, и все они работают отлично, но у меня есть одно поле со списком, который прекрасно работает при нагрузке, но как только вы меняете вкладки и возвращаетесь, комбинированный список останавливается. Обратите внимание: это порядок объектов Form1> TableLayoutPanel> TabControl> TabPage> TableLayoutPanel> ComboBox.

На нагрузке: enter image description here

После смены вкладок (они окрашены любым фоном вкладки, на которой я только что щелкнул): enter image description here

Единственный способ исправить это - закрыть приложение и снова открыть. Пока я остаюсь на вкладке, управление работает отлично все время.

Вот как я загружаю данные для поля со списком:

private void LoadFGPN()
    {
        SqlConnection con = new SqlConnection(Properties.Resources.Tef7_Conn);

        SqlDataAdapter da;
        DataTable dt = new DataTable();
        StringBuilder sql = new StringBuilder();
        sql.Append("SELECT DISTINCT(material) FROM [TEF7].[CM].[ALLPartNumbers] WHERE material LIKE '_____7______-6RP' OR material LIKE '_____4______-6RP' OR material LIKE '_________8__-6ML' OR material LIKE '_________[0-7,9]__-6ML'");

        da = new SqlDataAdapter(sql.ToString(), con);
        da.Fill(dt);

        if (cbFGPN.DataSource == null)
        {
            cbFGPN.DataSource = dt;
        }
        else
        {
            cbFGPN.DataSource = null;
            cbFGPN.DataSource = dt;
        }
        cbFGPN.ValueMember = "material";
        cbFGPN.DisplayMember = "material";
    } //loads finished good combo box on kanban

Что я пробовал:
Событие SelectionChangeCommitted и добавление .Refresh () и .Invalidate () / .Update () по отдельности безуспешно.
* Свойство Draw Mode поля со списком установлено на Normal
* winforms tabcontrol
* Подвесить краску
* событие принудительного рисования

Я в тупике. Есть идеи как это исправить?

РЕДАКТИРОВАТЬ: Просто чтобы быть смешным, я попробовал следующее безуспешно. Управление остается скрытым.

if (tcMain.SelectedIndex == 0)
        {
            cbFGPN.Hide();
            LoadPreOrderGridview("eKanban", null, null, null, null, null); //loads preorder gridview
            LoadFGPN();
            LoadRawPN();
            cbFGPN.Show();
            tlpMain.Refresh();
            tcMain.Refresh();
            tpKanban.Refresh();
            tlpKanban.Refresh();
            pnKanban.Refresh();
            cbFGPN.Refresh();
        }

1 Ответ

0 голосов
/ 06 сентября 2018

Решение этого очень просто. Просто добавьте Value и Display код участника, прежде чем назначить datasource в выпадающий список.

так вместо:

if (cbFGPN.DataSource == null)
{
    cbFGPN.DataSource = dt;
}
else
{
    cbFGPN.DataSource = null;
    cbFGPN.DataSource = dt;
}
cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";

Do:

cbFGPN.ValueMember = "material";
cbFGPN.DisplayMember = "material";

if (cbFGPN.DataSource == null)
{
    cbFGPN.DataSource = dt;
}
else
{
    cbFGPN.DataSource = null;
    cbFGPN.DataSource = dt;
}

Почему это происходит?

Когда вы хотите присвоить DisplayMember и ValueMember уже заполненного элемента, он переходит к каждому объекту в этом элементе и пишет ему, что использовать в качестве display и что в качестве value члена, и каждый раз, когда он входит объект, который уже существует, запускает несколько событий (таких как validated, validating, textChanged, dataSourceChanged и другие (это зависит от элемента)), и когда вам нужно запустить как 10 событий * 4700 строк, он «зависает» - это занимает слишком много времени для завершения.

Когда вы присваиваете Displaymember и ValueMember перед источником данных, а затем изменяете источник данных только один раз, все объекты наследуют Display и Value свойство-члена и не запускают события, поэтому оно не останавливается.

Важное замечание: поскольку я тестировал и работал с этим, везде ожидаются checkedListBox и ListBox. По какой-то причине он не позволяет мне назначить Display and Value членов, прежде чем я назначу источник данных.

...