我的问题是为什么在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 ;
}
}
}
答案 0 :(得分:1)
好吧,反对我更好的判断,我将为此提供部分答案。
首先,这是不是 VB.NET,这是C#。
其次,我找不到任何实际为您添加行的代码或表示您已尝试过它。所以我只会回答你在评论中提出的问题。这是因为你似乎有点难以掌握,我想要有所帮助。
这是:“问题是为什么我在文本框中按键,单元格位置将移动到上面的单元格。”
当您选择带有星号(*)作为行号的新行时,会发生这种情况。这称为“手动添加行”。
现在,当您尝试从文本框中添加文本时,选择最后一行并开始在文本框中键入内容。然后发生的事情是事件KeyDown被触发并执行此命令:
this.dataGridView1.AllowUserToAddRows = false;
为简单起见,这意味着“使用星号(*)删除行”。所以现在最后一行不再存在,DataGridView需要一个新的选择。然后将选择传递给上面的行。所以现在第二行是最后一行,它将被选中。然后执行以下命令:
this.dataGridView1 .AllowUserToAddRows =true;
这意味着“使用星号(*)创建行”,从而使最后一行再次出现。但是,再次添加此行不会影响第二行的最后一行选择。所以它仍然被选中。这会产生结果,选择跳到上面的行。