检索选定单元格位置;在列表视图

本文关键字:列表 视图 位置 单元格 检索 | 更新日期: 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