1

が付いたアプリケーションがあり、ホバーされているセルに関するより詳細な情報を提供DataGridViewするイベントを設定しようとしています。MouseHover

私のコードは次のとおりです。

private void dataCaseHistory_MouseHover(object sender, EventArgs e)
{
    try
    {
        DataGridView grid = (DataGridView)sender;
        Point clientPos = grid.PointToClient(Control.MousePosition);
        DataGridViewCell cell = (DataGridViewCell)grid[clientPos.X, clientPos.Y];
        int cellRow = cell.RowIndex;
        int cellColumn = cell.ColumnIndex;

        DataTable table = (DataTable)dataCaseHistory.DataSource;
        int docColumn = table.Columns.IndexOf("Doc");
        if (cellColumn == docColumn)
        {
            var varBundleID = table.Rows[cellRow]["BundleID"];
            if (varBundleID != DBNull.Value && varBundleID != null)
            {
                int bundleID = (int)varBundleID;
                cBundle bundle = new cBundle(bundleID);
                string header = "Bundle: '" + bundle.Name + "'";
                string body = "";
                foreach (DataRow row in bundle.DocumentBundle.Rows)
                {
                    int docID = (int)row["DocumentID"];
                    cDocument doc = new cDocument(docID);
                    body += doc.DocumentName + Environment.NewLine;
                }
                MessageBox.Show(body, header);
            }
            else
            {
                var varDocID = table.Rows[cellRow]["DocID"];
                if (varDocID != DBNull.Value && varDocID != null)
                {
                    int docID = (int)varDocID;
                    cDocument doc = new cDocument(docID);
                    string header = "Document";
                    string body = doc.DocumentName;
                    MessageBox.Show(body, header);
                }
            }
        }                
    }
    catch (Exception eX)
    {
        string eM = "Error occurred when Single Clicking a Document link in the History tab";
        aError err = new aError(eX, eM);
        MessageBox.Show(eX.Message, eM);
    }
}

しかし、フォームが読み込まれるとすぐに、マウスを動かすたびに、インデックスが範囲外のエラーになります。私はこれまでこのイベントを使用したことがないので、誰かが私がどこで間違っているのかを指摘できれば、私は最も感謝しています。

4

1 に答える 1

2

このコード行でアクセスする Item[] プロパティ:

    DataGridViewCell cell = (DataGridViewCell)grid[clientPos.X, clientPos.Y];

画面座標ではなく行と列でインデックス付けされているため、画面座標はおそらくグリッド内の行または列の数よりもはるかに多く、IndexOutOfRange 例外が発生します。

HitTestInfo クラスを使用してセルを取得する必要があります。

    MouseEventArgs args = (MouseEventaArgs) e;  
    DataGridView.HitTestInfo hitTest = this.grid.HitTest(args.X, args.Y);
    if (hitTest.Type == DataGridViewHitTestType.Cell)
    {
         DataGridViewCell cell = (DataGridViewCell)this.Grid[hitText.ColumnIndex, hitTest.RowIndex];
         // execute business logic here
    }
于 2012-12-07T18:43:09.010 に答える