我有一個DevExpress GridControl
,它有一個ContextMenuStrip
,其上有兩個項目。 我希望能夠右鍵單擊GridControl
中的一條記錄,並啓動用戶的默認瀏覽器,並使用默認搜索引擎搜索ContextMenu
中的某個項目。獲取用戶右鍵單擊網格中的用戶在他們點擊上下文菜單中的項目之前
我的代碼:
int rowX, rowY;
private void genericView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
rowX = MousePosition.X;
rowY = MousePosition.Y;
}
}
private void tsmSearch_Click(object sender, EventArgs e)
{
int key = GetRowAt(gdcErrorLogDefaultView, rowX, rowY);
if (key < 0)
return;
string ex = gdcErrorLogDefaultView.GetRowCellValue(key, "Exception").ToString();
//Logic to launch browser & search for ex
}
public int GetRowAt(GridView view, int x, int y)
{
return view.CalcHitInfo(new Point(x, y)).RowHandle;
}
我知道GetRowAt正確地計算行,我用它爲一些在我的代碼的其他地方其他用途。但是,在我的tsmSearch_Click事件中沒有正確獲取密鑰。
在測試時,我在Click事件的if
語句中設置了一個斷點。 key
= -2147483648。我期望0,因爲在這個特定的測試中,我的網格中只有1行。
有沒有不同的方式來實現這一目標?該網格支持多選,因此我不想通過以編程方式右鍵單擊選擇該行來「覆蓋」它們的選擇。
這裏是什麼,我試圖描述的截圖:
感謝您的鏈接,但因此可能有用戶會選擇不右鍵單擊不選擇行。因此我需要在鼠標位置獲取該行。並且由於行索引是基於0的,爲什麼期望0會出錯? 0是第一個入口,並且只有一行。還有什麼可能呢? – sab669
@ sab669行句柄不是從零開始的 - 例如任何組行的行索引是負數,新項行的行索引是-2147483647(請參閱我的鏈接中的幫助文章)。無論如何,這不是你的問題,但它可能是一個普遍的問題。正如它在Mouse Cursor例子中指定的那樣,您應該使用基於客戶端的座標進行命中測試,例如'e.Location'而不是基於屏幕的'Control.MousePosition'。 – DmitryG
當然它們是基於零的。並且GetSelectedRows在Mouse Down事件觸發後纔會更新 - 在這種情況下太晚了。 – Grantly