private void EditItem(object sender, EventArgs e) { ListViewCell cell = ListViewCellLocator.GetCell(this.ListView, MousePosition.X, MousePosition.Y); if (cell == null) { return; } if (TextBoxColumns.Contains(cell.Column.Index)) { // 设置 EditBox 的位置、大小、内容、可显示等。 EditBox.Bounds = cell.Bounds; EditBox.Text = cell.Item.SubItems[cell.Column.Index].Text; EditBox.Visible = true; EditBox.Focus(); EditBox.Tag = cell; } }
/// /// 根据位置 x、y 获得 ListViewCell。 /// /// /// 工作区坐标表示的 x 轴坐标。 /// 工作区坐标表示的 y 轴坐标。 /// public static ListViewCell GetCell(ListView listView, int x, int y) { ListViewCell cell = new ListViewCell(); // 获得单元格所在的行。 cell.Item = listView.GetItemAt(x, y); if (cell.Item == null) { return(null); } cell.ItemIndex = cell.Item.Index; // 现在 Item.Index 还能用 // 根据各列宽度,获得单元格所在的列,以及 Bounds。 int currentX = cell.Item.GetBounds(ItemBoundsPortion.Entire).Left; // 依次循环各列,表示各列的起点值 int scrollLeft = GetScrollPos(listView.Handle.ToInt32(), 0); // 可能出现了横向滚动条,左边隐藏起来的宽度 for (int i = 0; i < listView.Columns.Count; i++) { if (scrollLeft + x >= currentX && scrollLeft + x < currentX + listView.Columns[i].Width) { cell.Column = listView.Columns[i]; // 列找到了 Rectangle itemBounds = cell.Item.GetBounds(ItemBoundsPortion.Entire); cell.Bounds = new Rectangle(currentX, itemBounds.Y, listView.Columns[i].Width, itemBounds.Height); break; } currentX += listView.Columns[i].Width; } if (cell.Column == null) { return(null); } return(cell); }