DataGridView 添加一行时,为什么会在后面出来两个空行

xiaoxinghappy 2007-01-21 12:26:39
DataGridView 绑定的数据源是 mDetailTable,
在DataGridView 中单击"品名"一列时,
先 mDetailTable.NewRow() 得到一个新的row,然后将这个row传给弹出窗口,
由弹出窗口编辑内容后返回这个row,让mDetailTable.Rows.Add(row)添加数据,
然后DataGridView 刷新 dgvEdit.Refresh(),

现在的问题是添加一行记录后,DataGridView后面会出来两个空行,
按我的想法,最多应该是一个用来新增的空行啊,这个是什么问题,怎么解决啊?

DataGridView 的EditMode 是 EditProgrammatically

CSDN不能帖图,我画个样子,大家帮我看看
┏┳━━┳━━┳━━┳━━┓
┃┃品名┃型号┃单位┃数量┃ //列头
┣╋━━╋━━╋━━╋━━┫
┃┃001 ┃S001┃ 个 ┃1000┃
┣╋━━╋━━╋━━╋━━┫
┃┃  ┃  ┃  ┃  ┃ //空行一,添加后,焦点会自动到这一行第一列
┣╋━━╋━━╋━━╋━━┫
┃┃  ┃  ┃  ┃  ┃ //空行二,不知道为什么会出来?
┗┻━━┻━━┻━━┻━━┛

//连接数据源
private void InitData()
{
dgvEdit.DataSource = mDetailTable;
}

//在品名一列单击时,弹出一个窗口编辑数据
private void dgvEdit_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (dgvEdit.Columns[e.ColumnIndex].Name == "品名")
{
FormOrderDetailInput frmInput = new FormOrderDetailInput();
DataRow row;
if (e.RowIndex >= mDetailTable.Rows.Count)
{
row = mDetailTable.NewRow();
}
else
{
row = mDetailTable.Rows[e.RowIndex];
}
frmInput.EditOrderDetail(row);
if (frmInput.DialogResult == DialogResult.OK)
{
if (e.RowIndex >= mDetailTable.Rows.Count)
{
mDetailTable.Rows.Add(row);
//dgvEdit.CancelEdit(); 添加后用取消编辑也没用
//dgvEdit.EndEdit(); 添加后提交也没用
}
dgvEdit.Refresh();
}
}
}

...全文
928 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Allean 2010-06-23
  • 打赏
  • 举报
回复
316471644
sdl2005lyx 2007-01-21
  • 打赏
  • 举报
回复
lz比较有心,对待技术很认真,相信你的技术会提高很快的!!
xiaoxinghappy 2007-01-21
  • 打赏
  • 举报
回复
解决了这个问题,我真的感动的快哭了,这个问题困扰了我好几天时间,再次感谢各位!
xiaoxinghappy 2007-01-21
  • 打赏
  • 举报
回复
谢谢大家,问题终于解决了
因为我要新增数据,又不想再加按钮作新增记录,所以 dataGridView.AllowUserToAddRows一直高为True,这样在记录集为空时,可以单击空行增加记录。

对于liuja_0421说得,为什么不直接通过 DataGridView 编辑,因为我对C#还不是很了解,这个DataGridView用得还不是很熟,二是因为很多地方都说编辑绑定的DataGridView最好直接编辑数据源,这样DataGridView就可以直接更新,所以我也想这么做,究竟那种方法好,我也不敢说,三是因为这个DataTable其实会连接几个子表,其中的项目不过用ID来关联的,这个我知道用 DataGridViewComboBoxColumn 可以实现,但是这样好像就把这一列绑定到了基本项目表了,比如说单位,字段多了,每个都要定义一个 DataGridViewComboBoxColumn 好麻烦,不如直接在另一个窗体上面放一个 ComboBox,读写也方便,反正是我还太菜了。

好了,言归正传,把解决的方法说一下,经过楼上的提醒,虽然绑定的时候不能设置 DataGridView.AllowUserToAddRows=false;那我就在新增数据的地方加了这句,数据刷新后再把DataGridView.AllowUserToAddRows=true;设置回来就OK了

DataGridView.AllowUserToAddRows=false;
if (e.RowIndex >= mDetailTable.Rows.Count)
{
mDetailTable.Rows.Add(row);

//dgvEdit.CancelEdit(); 添加后用取消编辑也没用
//dgvEdit.EndEdit(); 添加后提交也没用
}
dgvEdit.Refresh();
DataGridView.AllowUserToAddRows=true;
liujia_0421 2007-01-21
  • 打赏
  • 举报
回复
for example:

private DataSet ds = new DataSet();
private void button1_Click(object sender, EventArgs e)
{
//增加一条数据
DataRow newRow = ds.Tables["student"].NewRow();
newRow["sno"] = "111";
newRow["sname"] = "bbb";
newRow["sage"] = 23;
ds.Tables["student"].Rows.Add(newRow);
this.dataGridView1.Refresh();
}

private void Form1_Load(object sender, EventArgs e)
{
DataBind();
}
//数据绑定
private void DataBind()
{
SqlConnection con = new SqlConnection("server=.;database=student;uid=sa;pwd=0421");
SqlDataAdapter sda = new SqlDataAdapter("select * from studentDetails", con);
sda.Fill(ds, "student");
//绑定之前设置
this.dataGridView1.AllowUserToAddRows = false;
this.dataGridView1.DataSource = ds.Tables["student"];
}
liujia_0421 2007-01-21
  • 打赏
  • 举报
回复
你在绑定数据前就设置一下这个就行了..

this.dataGridView1.AllowUserToAddRows = false;

或者直接在界面,将DataGridView的这个属性设为false即可..
liujia_0421 2007-01-21
  • 打赏
  • 举报
回复
其实你直接对DataGridView进行编辑不好吗?

为什么还做得那么复杂,先通过单击列名,再弹一个对话框,再....
liujia_0421 2007-01-21
  • 打赏
  • 举报
回复
try...

this.dataGridView1.AllowUserToAddRows = false;

加上这句就不会多出来一行了..
xu_2007 2007-01-21
  • 打赏
  • 举报
回复
关注中
xiaoxinghappy 2007-01-21
  • 打赏
  • 举报
回复
急顶

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧