0

私はに非常に新しいC#です。

bindinglistのデータ ソースであるmy からオブジェクトを削除できる必要がありますdatagridview。最後のアイテムを削除すると、次の例外が発生します。

System.NullReferenceException: Object reference not set to an instance of an object.
 at System.Windows.Forms.DataGridViewRow.BuildInheritedRowStyle(Int32 rowIndex,              
DataGridViewCellStyle inheritedRowStyle)
 at System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds,   
Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean    isFirstDisplayedRow, Boolean isLastVisibleRow)
 at System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, 
Rectangle clipRect, Boolean singleHorizontalBorderAdded)
 at System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, 
Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
 at System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
 at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
 at System.Windows.Forms.Control.WmPaint(Message& m)
 at System.Windows.Forms.Control.WndProc(Message& m)
 at System.Windows.Forms.DataGridView.WndProc(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
 at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
 at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

オブジェクトを削除するための私のコードは次のとおりです。

study は study オブジェクトのバインディングリストです。

    private void removeComplete()
    {

        if (studies.Count == 0)
            return;

        // Create temp list of copleted studies
        List<study> completedStudies = studies.Where(s => s.isComplete() == true).ToList();

        if (studies.Count == 0)
        { 
           // do nothing
        }
        else
        {
            // If I don't use this line, every row produces the same exception 
            studies.RaiseListChangedEvents = false;

            foreach (study study in completedStudies)
            {
                try
                {
                    studies.Remove(study);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                break;
            }

            // Turn it back on after turning it off above
            studies.RaiseListChangedEvents = true;

            // This is the point where it fails
            studies.ResetBindings();
        }
    }

私が見る限り、datagridview はまだソースから削除されたばかりの行を追加しようとしているようです。これは私にとって本当に奇妙です。

助けてください!

4

1 に答える 1

0

元の質問に対するコメントともう少し調査した結果、removeComplete() メソッドの呼び出しが UI スレッド上にある必要があることが原因であることがわかりました。これを行うには、以下に示すように BeginInvoke を使用しました。

public delegate void processDelegate();

private void processCompleted(object sender, EventArgs e)
{

    processDelegate simpleDelegate = new processDelegate(removeComplete);
    BeginInvoke(simpleDelegate);

}
于 2012-09-04T09:06:45.927 に答える