检索选定单元格位置;在列表视图
本文关键字:列表 视图 位置 单元格 检索 | 更新日期: 2023-09-27 18:06:54
我让它完美地为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控件在父/表单以外的容器,所以我能做错什么?
好了,我解决了!关键是在Rectangle
道具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();
}
你可以这样使用:
private void listview1_MouseClick(object sender, MouseEventArgs e) {
SetControlOnCell(listview1, txtEditValue, e)
}
我对此很满意,因为它的目的是在点击单元格的顶部显示一个"伪"控件(就像我想要的那样)。然而,我一直在开放这个问题的线程,以便这里的其他人可能有更好的解决方案,并愿意分享。
,
EDIT: Ok,既然没有人出现——线程已经解决了,我猜
我在我的一个应用程序中这样做的方式是,我有一个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
。