C# 动态 DataGridViewCell 点击事件

Posted

技术标签:

【中文标题】C# 动态 DataGridViewCell 点击事件【英文标题】:C# Dynamic DataGridViewCell Click Event 【发布时间】:2021-02-06 05:40:29 【问题描述】:

我有一个 DGV 要被点击,另一个要根据这种点击类型创建并显示在屏幕上以用于特殊工作目的。在其他 DGV 的某些单元格(某些行列逻辑)的创建过程中,将使用程序代码自动单击。下面的代码执行此操作的 AUTO CLICK 代码部分。但我相信必须有另一种方法(如在 Button PerformClick Event Fire 中)来实现此点击操作:

            DataGridViewCell dc;
            dc = MyDataGridView[0, 0];
            Rectangle rect = this.MyDataGridView.GetCellDisplayRectangle(0, 0, true);
            MouseButtons b = new MouseButtons();
            MouseEventArgs mev = new MouseEventArgs(b, 1, rect.X, rect.Y, 1);
            DataGridViewCellMouseEventArgs e = new DataGridViewCellMouseEventArgs(0, 0, rect.X + 2, rect.Y + 2, mev);
            MyDataGridView_CellMouseClick(dgvEntegCompany, e);

【问题讨论】:

您的问题是什么? DataGridView 已经有 CellMouseClick 事件。 为什么要显式执行事件处理程序? 动态需要时请考虑“Button PerformClick”事件,这一次我需要点击DataGridView的任何需要的单元格(列、行)。上面的代码虽然解决了我的问题,但我认为必须有一个 SendMessage 脚本来解决这个问题...... 不清楚你的意思……”请在需要动态时考虑“Button PerformClick”事件,”?……另外,您的评论…… “虽然上面的代码解决了我的问题,但我认为必须有一个 SendMessage 脚本来解决这个问题”?… 代码解决了什么“问题”?发布的代码看起来没有必要。同样,您遇到了什么“问题”以及“如何”发布的代码解决了这个问题或没有解决它。我已经问过了……你的问题是什么。 谢谢,我有一个编辑... 【参考方案1】:

我假设这就是你的意思……

“DataGridView 单元格单击任意列 - 行的触发事件代码”

...您是否要订阅网格事件,当用户“单击”网格中的任何单元格时将触发该事件。

如果是这种情况……那么,订阅网格 CellClickCellMouseClick 事件。

如果您想订阅网格CellMouseClick 事件,那么可以在设计器中完成该代码,或者您可以在调用InitializeComponent(); 方法后在表单构造函数中添加代码,它会看起来像喜欢……

dataGridView1.CellMouseClick += new DataGridViewCellMouseEventHandler(dataGridView1_CellMouseClick);

然后你需要创建事件处理方法...dataGridView1_CellMouseClick. 在这个事件中你可以检查DataGridViewCellMouseEventArgs 对象来查看哪个单元格被点击了。该对象具有用于单击单元格的行索引和列索引的属性。下面是一个例子。

private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
  // This event will fire whenever a user clicks on a cell
  // we can get the row and column index of the "clicked" cell
  MessageBox.Show("Cell at Row: " + e.RowIndex + " Col: " + e.ColumnIndex + "  was clicked");

每次用户单击网格中的单元格时都会触发此事件。

目前尚不清楚您想用当前代码完成什么。

【讨论】:

好点,我没有意识到 OP 可能不知道如何订阅事件。 @Oak_3260548 ...我仍然不确定这是否是 OP 所要求的。就像您评论的那样,您的答案也是正确的。 我很尴尬 :),忘记 用户“点击”了网格。 代码本身将创建一个网格并单击一个单元格(而不是用户)(由程序代码检测)。就好像你和电脑下棋一样,你的移动机器会决定移动哪个图形,移动到哪里...... 我不知道该说什么你最后的评论没有适得其反。您的评论听起来像是计算机有自己的想法……“就好像您在下棋后与计算机下棋一样,您的移动机器将决定要移动哪个图形以及移动到哪里。” ...?机器很笨,不会……“决定要移动哪个图形以及移动到哪里”……你的代码决定了这一点。 我很抱歉,但我已经完成了这个来回的评论,这是绝对无处可去的。也许,用您最后的评论编辑您的问题,以便其他人可以提供帮助。对于您异想天开的问题,我显然没有想法。祝你好运。【参考方案2】:

这个问题不是很清楚。您只是在寻找CellClick 活动吗?

编辑:那么您需要执行 CellClick 的 content 吗? CellClick 是一个事件,所以它在单元格单击事件发生时触发。它可以包含对方法的调用,如果愿意,您也可以“动态地”独立调用。

    // CellClick event
    private void dgItems_CellClick(object sender, DataGridViewCellEventArgs e)
    
        MyMessage(e.RowIndex, e.ColumnIndex);
    

    // A user method
    private void MyMessage(Int32 irow, Int32 icol)
    
        System.Windows.Forms.MessageBox.Show("A cell [" + irow  + ", " + icol  + "] was clicked!");
    

    // invoking from a button
    private void button1_Click(object sender, EventArgs e)
    
        MyMessage(this.dgItems.SelectedCells[0].RowIndex, this.dgItems.SelectedCells[0].ColumnIndex );
    

编辑 2:

没有自动点击之类的东西。

如果您想在可能的事件中执行代码,请参见上面的代码 如果您想执行视觉更改,例如选择一个单元格,只需执行此操作。请注意,此操作取决于SelectionMode 的设置,例如,CellFullRowSelect 的行为方式不同。会是这样的:
    this.DataGridView1.ClearSelection();
    this.DataGridView1.Rows[0].Cells[3].Selected = True;
如果您正在寻找一种调用动作的方法(也称为计算机 AI 播放器),您很可能必须研究多线程,即 BackgroundWorker 并创建一个单独的线程来控制游戏/模拟/等等。那么问题仍然存在于数光年之外

备注:你必须更好地表达你的问题,这意味着要付出更多的努力来撰写它。这样你只是在浪费社区时间。

【讨论】:

我仍然不确定我是否理解正确,但如果您的意思是从 CellClick 事件和 Button 运行相同的方法,请在我的编辑中查看一个简单的方法。否则,请更清楚地解释您要达到的目标。【参考方案3】:

即使是这两行代码也会执行所需的操作:

DataGridViewCellEventArgs e = new DataGridViewCellEventArgs(ColIdx, RowIdx);
MyDataGridvView_CellClick(myDGV, e); 

【讨论】:

以上是关于C# 动态 DataGridViewCell 点击事件的主要内容,如果未能解决你的问题,请参考以下文章

在只读对象属性上编辑 DataGridViewCell

DATAGridViewCell 自定义视图按钮操作方法没有被调用?

将数据绑定 DataGridView 上的单元格类型更改为自定义 DataGridViewCell 类型

c#中如何动态添加菜单项并实现其点击?

C#中DataTable动态添加行和删除行的问题?

C# datagridview 单元格内值改变时触发了哪些事件