代码之家  ›  专栏  ›  技术社区  ›  pradeepradyumna

C#ListView标签编辑在特定列上

  •  3
  • pradeepradyumna  · 技术社区  · 7 年前

    我有一个包含两列的列表视图 LabelEdit = true . 现在我已经编写了以下代码 KeyDown 事件

                if (e.KeyData == Keys.F2 && lvwColumns.SelectedItems.Count > 0)
                {
                    lvwColumns.SelectedItems[0].BeginEdit();
                    return;
                }
    

    每当我按F2键时,第一列将启用编辑。是否可以在第二列中进行编辑?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Z.R.T.    7 年前

    我认为listViewSubItem在UI中是不可编辑的。你可以发挥你的想象力,把文本框放在你想要编辑的单元格上

        TextBox txtBox1 = new TextBox();
        private int subItemIndex = 0;
        private ListViewItem viewItem;
    
        private int? xpos = null;
        private void listView_Click(object sender, EventArgs e)
        {
            xpos = MousePosition.X - listView.PointToScreen(Point.Empty).X;
        } 
    
        public MainForm()
        {
            InitializeComponent();
            listView.Controls.Add(txtBox1);
            txtBox1.Visible = false;
            txtBox1.KeyPress += (sender, args) =>
            {
                TextBox textBox = sender as TextBox;
    
                if ((int)args.KeyChar == 13)
                {
                    if (viewItem != null)
                    {
                        viewItem.SubItems[subItemIndex].Text = textBox.Text;
                    }
                    textBox.Visible = false;
                }
            };
        }
    
            private void listView_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyData == Keys.F2 && listView.SelectedItems.Count > 0)
                {
                    viewItem = listView.SelectedItems[0];
                    var bounds = viewItem.Bounds;
                    var col2_bounds = viewItem.SubItems[1].Bounds;
                    var col1_bounds = viewItem.SubItems[0].Bounds;
                    col1_bounds.Width -= col2_bounds.Width;
    
    
                    if (xpos > col2_bounds.X)
                    {
                        subItemIndex = 1;
                        txtBox1.SetBounds(col2_bounds.X, bounds.Y, col2_bounds.Width, bounds.Height);
                    }
                    else
                    {
                        subItemIndex = 0;
                        txtBox1.SetBounds(col1_bounds.X, bounds.Y, col1_bounds.Width, bounds.Height);
                    }
                    txtBox1.Text = string.Empty;
                    txtBox1.Visible = true;
                }
            }