1

タイトルの通り、

DataGridview.ScrollBars = 垂直;

DataGridview のビジョンに 4 行を含めることができると仮定します。行が 6 行になると、Vertical ScrollBar が表示されます。ただし、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;
    }
}
4

1 に答える 1

1

これは、スレッドセーフでない方法でコントロールを使用していることを検出しようとする Windows フォームのデバッグ ロジックのリークの 1 つです。UI スレッド以外のスレッドで DataSource プロパティを割り当てていることはわかりません。

スレッド化されたロジックを実装するには、BackgroundWorker を使用します。その RunworkerCompleted イベント ハンドラーを使用して、グリッドの DataSource プロパティを設定します。または、既存のスレッド コードを保持する場合は Control.Invoke を使用します。

于 2010-10-27T12:16:19.560 に答える