[英]C# NET WinForms Alternative to DataGridView for displaying user controls
[英]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.