datagridview,CurrentCellChanged,AllowUserToAddRows,textbox.keydown事件

时间:2014-06-05 03:46:04

标签: vb.net winforms datagridview textbox

我的问题是为什么在datagridview中添加一个文本框控件,然后按键盘向datagridview添加一个空行。但是我发现光标总是跳到行的单元格上方,而不是我按下键盘的单元格的位置。所以我感到困惑。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Visible = false;
            textBox1.Width = 0;
            dataGridView1.Controls.Add(textBoxenter code here1); 
            System.Data.DataTable dt = new DataTable();
            dt.Columns.Add("Name");`enter code here`
            dt.Columns.Add("Sex");
            System.Data.DataRow dr;
            for (int i = 0; i < 10; i++)
            {
                dr = dt.NewRow();
                dr["Name"] = string.Format("Name{0}", i);
                dr["Sex"] = string.Format("Sex{0}", i);
                dt.Rows.Add(dr);
            }
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.DataSource = dt;
        }

        private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
        {
            this.textBox1.Visible = false;
            this.textBox1.Width = 0;
            try
            {

                if                 (dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].HeaderText == "Name")
                {                   
                    this.textBox1.Left = dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, true).Left;`</i>`
                    this.textBox1.Top = dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, true).Top;`</i>`
                    this.textBox1.Width = dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, true).Width - 2;`</i>enter code here`
                    this.textBox1.Height = `</i>`dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex, dataGridView1.CurrentCell.RowIndex, true).Height - 2;
`</i>`
                 string str = Convert.ToString(this.dataGridView1.CurrentCell.Value); this.textBox1.Text = str;
                    this.textBox1.Visible = true;
                }
            }
            catch
            {
            }
        }
        private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            this.dataGridView1.CurrentCell.Value = this.textBox1.Text;
        }
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
           this.dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1 .AllowUserToAddRows =true ;
        }

    }
}

1 个答案:

答案 0 :(得分:1)

好吧,反对我更好的判断,我将为此提供部分答案。

首先,这是不是 VB.NET,这是C#。

其次,我找不到任何实际为您添加行的代码或表示您已尝试过它。所以我只会回答你在评论中提出的问题。这是因为你似乎有点难以掌握,我想要有所帮助。

这是:“问题是为什么我在文本框中按键,单元格位置将移动到上面的单元格。”

当您选择带有星号(*)作为行号的新行时,会发生这种情况。这称为“手动添加行”。

现在,当您尝试从文本框中添加文本时,选择最后一行并开始在文本框中键入内容。然后发生的事情是事件KeyDown被触发并执行此命令:

this.dataGridView1.AllowUserToAddRows = false;

为简单起见,这意味着“使用星号(*)删除行”。所以现在最后一行不再存在,DataGridView需要一个新的选择。然后将选择传递给上面的行。所以现在第二行是最后一行,它将被选中。然后执行以下命令:

this.dataGridView1 .AllowUserToAddRows =true;

这意味着“使用星号(*)创建行”,从而使最后一行再次出现。但是,再次添加此行不会影响第二行的最后一行选择。所以它仍然被选中。这会产生结果,选择跳到上面的行。