繁体   English   中英

C#Winforms - 如何在datagridview中托管用户控件(带子代)来响应鼠标事件?

[英]C# Winforms - How can I have user controls (with children) hosted in a datagridview respond to mouse events?

我已经设法在DataGridView中使用类似于指南的东西来托管用户控件: https//msdn.microsoft.com/en-us/library/7tas5c80%28v=vs.110%29.aspx我的控件是一个有点复杂,所以我手动画它们。

我遇到的问题是,当鼠标越过DataGridView中的单元格时,它显然不会触发该控件的事件,因为它是一个单元而不是一个控件。 我的第一个解决方案是丑陋的。 我将OnMouseEnter等事件激活器暴露给我正在托管的控件,然后使用DataGridView中的事件(如CellMouseEnter)来调用这些暴露的激活器。 问题是这不仅是丑陋的,而且也行不通。 这只会触发顶级控件。 因此,如果我的控件有孩子,那么我必须以某种方式将事件传递给他们。 这对于MouseMove和其他东西来说并不算太糟糕,但我认为为每个子控件手动计算像MouseEnter / MouseLeave这样的事件最终会非常容易出错。

我的第二个想法是将控件放在DataGridView中,但不是在DataGridView中绘制它们,而是在DataGridView的顶部覆盖控件的实际实例,其中单元格将是,但这似乎相当hacky并且可能出错易于。

有没有办法以远程干净的方式实现我想做的事情? 看起来它应该是相对微不足道的,但我花了很多时间在这上面,并且无法提出令人满意的清洁解决方案。

原来这很简单。 DataGridView支持在编辑模式下呈现为控件而不是单元格的控件。 托管控件需要实现IDataGridViewEditingControl接口,但是一旦他们这样做,就可以很简单地验证它是一个你希望能够与之交互的控件,然后在将鼠标放在它上面时将其设置为编辑模式。

这是一个专门的问题,因此很难一般使用代码,但在实现IDataGridViewEditingControl接口并为您的控件设置Cell和Column类之后(如https://msdn.microsoft.com/en-us/library/7tas5c80所述) %28v = vs.110%29.aspx )这里是一个挂钩编辑的简单方法:

    private void DataGridView1_MouseMove(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y);
        if (hit.Type == DataGridViewHitTestType.Cell)
        {
            DataGridViewCell clicked = dataGridView1.Rows[hit.RowIndex].Cells[hit.ColumnIndex];
            if (typeof(YourDesiredControlType).IsAssignableFrom(clicked.ValueType))
            {
                dataGridView1.CurrentCell = clicked;
                dataGridView1.BeginEdit(false);
            }
            else
                dataGridView1.EndEdit();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM