我为 Y 坐标完美地工作,这是我尝试过的:
public Point GetCellPos(MouseEventArgs e){
ListViewHitTestInfo lit = listview1.HitTest(e.Location);
Point p = new Point
{
X = listview1.Left + lit.Item.Position.X,
Y = listview1.Top + lit.Item.Position.Y
};
return p;
}
由于某种原因,它不会得到正确的 X 坐标。作为旁注,我没有将listview控件放在父/表单以外的容器中,所以我可能做错了什么?任何帮助将不胜感激,请。
答案 0 :(得分:1)
Rectangle
的{{1}}道具中!我继续修补Bound
坐标而忽略了X, Y
这实际上我正在寻找的东西!但无论如何,我正在为那些可能在未来遇到同样问题的人发布我简陋的片段:
Rectangle
你用它就像:
private void SetControlOnCell(ListView lv, Control eControl, MouseEventArgs e) {
ListViewHitTestInfo lit = lv.HitTest(e.Location);
Point p = new Point
{
X = lv.Left + lit.SubItem.Bounds.Left + 1,
Y = lv.Top + lit.SubItem.Bounds.Top
};
int w = (lit.SubItem.Bounds.Left == 0) ? lv.Columns[0].Width : lit.SubItem.Bounds.Width;
int h = lit.SubItem.Bounds.Height;
eControl.Location = p;
eControl.Size = new Size(w, h);
if (!eControl.Visible) eControl.Visible = true;
if (eControl.Font != lit.SubItem.Font) eControl.Font = lit.SubItem.Font;
eControl.Text = lit.SubItem.Text;
eControl.Focus();
}
我对此非常满意,因为它的目的是在点击的单元格上显示“伪”控件(就像我想要的那样)。但是,我仍然保持这个问题的主题,以获得其他人可能拥有并愿意分享的更好的解决方案。
-
编辑:好的,因为没有人出现 - 线程已经解决了我猜。
答案 1 :(得分:0)
好的,我在我的某个应用中执行此操作的方式是,当用户右键单击ContextMenuStrip
中的某个项目时,我已经为此设置了ListView
。从这里,您可以自定义菜单本身,以便在需要时在其中包含控件,或者只需打开一个对话框来编辑项目属性。
这是我的点击处理程序:
private void listView1_MouseClick(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
var item = listView1.GetItemAt(e.Location.X, e.Location.Y);
if (item != null) {
menuItemSelected.Show(Cursor.Position);
menuItemSelected.Tag = item.Tag;
}
}
}
我将特定于项目的信息存储在Tag
属性中,因为这样可以非常方便地在我的程序中使用。
您可以用某些内容替换menuItemSelected.Show()
,以便在正确的位置显示您想要的控件。
请注意,这会将其显示在用户右键单击项目的位置,而不是项目的左上角。如果您想这样做,请将Cursor.Position
替换为item.Position
。