检索选定的单元格"位置"在Listview上?

时间:2014-06-04 13:13:58

标签: c# winforms listview

我为 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控件放在父/表单以外的容器中,所以我可能做错了什么?任何帮助将不胜感激,请。

2 个答案:

答案 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