Полосы прокрутки DataGridview будут Crash, когда высота всех строк превышает высоту поля зрения DataGridview. - PullRequest
1 голос
/ 27 октября 2010

Как следует из названия,

DataGridview.ScrollBars = Вертикальный;

Предположим, что видение DataGridview может содержать 4 строки, если строка достигает 6, она имеет вертикальную полосу прокрутки. Но если нажать ScrollBar, программа вылетит. Если мы установим DataGridview.ScrollBars = None, никаких проблем не будет.

public partial class visitorLeave : Form
{
    public visitorLeave()
    {
        InitializeComponent();
    }
    bool isWorkerStopped = false;
    bool clickstart = false;
    ManageEmployee me = null;

    Thread tr1;

    private void visitorLeave_Load(object sender, EventArgs e)
    {
        me = new ManageEmployee(10);
        dataGridView1.AutoGenerateColumns = false;
        dataGridView1.DataSource = me.DataSource;
        tr1 = new Thread(new ThreadStart(Add));
        tr1.IsBackground = true;
        tr1.Start();
    }

    void Add()
    {
        while (!isWorkerStopped)
        {
            if (clickstart)
            {
                me.AddEmployee(new EmployeeData("new" + DateTime.Now.Ticks.ToString(), "0", "0", "0", "0", "0", null));
                dataGridView1.DataSource = me.DataSource;
                dataGridView1.UpdateRowHeightInfo(0, true);
                clickstart = false;
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        clickstart = !clickstart;
    }
}

1 Ответ

1 голос
/ 27 октября 2010

Это одна из утечек в логике отладки Windows Forms, которая пытается обнаружить вас с помощью элементов управления небезопасным способом. Он не может видеть, как вы назначаете свойство DataSource в потоке, отличном от потока пользовательского интерфейса.

Используйте BackgroundWorker для реализации вашей логики. И используйте его обработчик событий RunworkerCompleted, чтобы установить свойство DataSource сетки. Или используйте Control.Invoke, если вы предпочитаете сохранить существующий код многопоточности.

...