问题 如何处理DataGridViewLinkColumn的click事件


我在C#中有一个WinForm。其中一列 DataGridView 是类型 DataGridViewLinkColumn。如何处理每列上的click事件?

此代码似乎不起作用:

private void UserDataTable_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //Code here
        }

例如,如果我有10行,每当我点击与该列对应的每一行的内容时DataGridViewLinkColumn“,我应该能够处理它。

谢谢


4408
2017-10-22 12:23


起源



答案:


你为什么不用 CellClick 事件处理程序,你可以参考每一行的相应列, e.RowIndex 通过使用 e.ColumnIndex, 如下所示:

private void dataGridView1_CellClick(object sender,
    DataGridViewCellEventArgs e)
{
    // here you can have column reference by using e.ColumnIndex
    DataGridViewImageCell cell = (DataGridViewImageCell)
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];

    // ... do something ...
}

11
2017-10-22 12:26



非常感谢。我曾想过类似的方法。但是,我想知道我能否做到 DataGridViewLinkColumn 处理点击事件。 - Kiran
这处理一个 细胞 单击。理想情况下,我认为我们希望附加到 链接 单击。 (如果不迭代每个链接单元格,如何做到这一点,我仍然试图找出自己!) - chessofnerd
我撒了谎,建议的解决方案确实开启了 链接 点击,不会开启 细胞 单击。这似乎与单元格点击事件应该做的非常不一致,但是,嘿,这是我们99%的人想要的! (我向在那里真正想要举办活动的可怜人士道歉 细胞 点击...) social.msdn.microsoft.com/Forums/windows/en-US/... - chessofnerd
你应该将DataGridViewImageCell cell =(dataGridView1.Rows [e.RowIndex] .Cells [e.ColumnIndex])作为DataGridViewImageCell;然后检查它是否为null,此事件将为所有单元格触发,因此您只想处理具有该类型的单元格


答案:


你为什么不用 CellClick 事件处理程序,你可以参考每一行的相应列, e.RowIndex 通过使用 e.ColumnIndex, 如下所示:

private void dataGridView1_CellClick(object sender,
    DataGridViewCellEventArgs e)
{
    // here you can have column reference by using e.ColumnIndex
    DataGridViewImageCell cell = (DataGridViewImageCell)
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];

    // ... do something ...
}

11
2017-10-22 12:26



非常感谢。我曾想过类似的方法。但是,我想知道我能否做到 DataGridViewLinkColumn 处理点击事件。 - Kiran
这处理一个 细胞 单击。理想情况下,我认为我们希望附加到 链接 单击。 (如果不迭代每个链接单元格,如何做到这一点,我仍然试图找出自己!) - chessofnerd
我撒了谎,建议的解决方案确实开启了 链接 点击,不会开启 细胞 单击。这似乎与单元格点击事件应该做的非常不一致,但是,嘿,这是我们99%的人想要的! (我向在那里真正想要举办活动的可怜人士道歉 细胞 点击...) social.msdn.microsoft.com/Forums/windows/en-US/... - chessofnerd
你应该将DataGridViewImageCell cell =(dataGridView1.Rows [e.RowIndex] .Cells [e.ColumnIndex])作为DataGridViewImageCell;然后检查它是否为null,此事件将为所有单元格触发,因此您只想处理具有该类型的单元格


实际上,我相信Kiran使用它是正确的 CellContentClick。使用此选项时,单击单元格的空白区域时,仅在单击其实际内容时才会触发。所以,如果你有一个 DataGridViewLinkColumn,点击链接时会触发。如果你有 DataGridViewTextBoxColumn 单击单元格中的文本时将触发。如果单击空白区域,则不会触发,或者如果单元格为空,则根本不会为该单元格触发。

CellClick 单击单元格的任何部分时会触发事件,包括空单元素。 @chessofnerd,我不确定为什么这对你不起作用,但我已经对此进行了测试以确保,至少对我而言,它的工作方式完全符合预期。

基兰,这让我想知道为什么你的 CellContentClick 起初没有工作。首先想到的是确保你添加一个新的 DataGridViewCellEventHandler 到gridview的CellContentClick属性。例如,如果我的gridview标题为gridVendorInfo,我需要首先使用以下代码:

this.gridVendorInfo.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.gridVendorInfo_CellContentClick);

现在我需要在我的代码中使用那个确切的方法来实际捕获它:

private void gridVendorInfo_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string vendorName = "";
            if (e.ColumnIndex == 0)
            {
                vendorName = gridVendorInfo.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            }
        }

如果你没有为gridview的CellContentClick事件分配一个新的事件处理程序并添加拼写完全相同的方法,它就不会触发。希望这有帮助!只需转到表单,单击gridview,转到Properties窗口中的Events选项卡,找到CellContentClick,然后双击它右侧的空格就容易多了。 VS将为您创建方法并为gridvew分配新的事件处理程序。然后你只需要进入方法并添加一些代码和一个断点来查看它是否正在触发,它应该是。


2
2018-02-24 16:52