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;
using System.Data.Sql;
using System.Data.SqlClient;
namespace DataGridView
{
public partial class Form1 : Form
{
DataSet ds = null;
public Form1()
{
InitializeComponent();
}
///
///
///
///
///
private void Form1_Load(object sender, EventArgs e)
{
string sql = "SELECT [CompanyName],[ContactName] FROM [Customers];";
BLL.SqlHelper sh = new BLL.SqlHelper();
ds = sh.Select(sql);
dataGridView1.DataSource = ds.Tables[0];
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
}
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
}
private void Insert_Click(object sender, EventArgs e)
{
int index = this.dataGridView1.SelectedRows[this.dataGridView1.SelectedRows.Count-1].Index;
dataGridView1.DataSource = null;
ds.Tables[0].Rows.InsertAt(ds.Tables[0].NewRow(), index);
dataGridView1.DataSource = ds.Tables[0];
dataGridView1.ClearSelection();
dataGridView1.Rows[index].Selected = true;
}
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
}
private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
{
}
private void dataGridView1_UserAddedRow(object sender, DataGridViewRowEventArgs e)
{
}
private void Delete_Click(object sender, EventArgs e)
{
int index = this.dataGridView1.SelectedRows[this.dataGridView1.SelectedRows.Count - 1].Index;
dataGridView1.DataSource = null;
ds.Tables[0].Rows.RemoveAt(index);
dataGridView1.DataSource = ds.Tables[0];
}
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
//MessageBox.Show(dataGridView1.SelectedRows.Count.ToString());
MessageBox.Show(dataGridView1.SelectedRows[0].Index.ToString());
}
}
}
窗体加载时datagridview1控件绑定了一个datatable
由于绑定数据源的datagridview无法增加行
故在 Insert_Click 事件中 ,先将 datagridview1 的 DataSource 属性 设为null
在 ds.tables[0] 中增加行
然后将datagridview1 的datasource 重新设为 ds.tables[0]
问题来了, 将 DataSource 重新设为 ds.tables[0] 时 , 默认选中哪一行?
为此 ,我在 DataBindingComplete事件中 弹出了绑定完成后 datagridview默认选中的行
发现有这样的情况 : 第一次绑定(也就是Form_Load 里的绑定) 时, 弹出的 MessageBox 里显示的是0
这点应该是合情合理 , 这点微软的工程师的思维和咱大多数人一样, 数据绑定完了,咱让他默认选中第一行,而不是第10行或是第11行(话说回来,万一一共就3行呢)
但是,当我选中第一行(也就是index为0)
然后,点击 插入 按钮 , 引发这个 Insert_Click 事件 ,从而 重新绑定 DataSource 时
出奇的发现 弹出 的MessageBox 里显示的是1
而且,当我选中第8行(也就是index 为7)
然后,点击 插入 按钮 , 引发这个 Insert_Click 事件 ,从而 重新绑定 DataSource 时
出奇的发现 弹出 的MessageBox 里显示的是7
百思不得其解
MS的工程师用了什么方法,竟然让datagridview能够记住上一次绑定数据时默认选中的行
并且在重新绑定数据源的时候再次选中这一行,并且很明显
这种“记忆”能力绝不是通过 记忆 index 来完成的
如果datagridview 记录上次选中行的index ,那么我在table 里面原索引的位置增加一行
下次绑定的时候 datagridview 应该选中我新增加的行才对
另一个奇怪的现象是
如果 在Inset_click 事件中 ,将DataSource 改成另一张表
那么MessageBox 弹出的 就会是0
将Insert_Click 改成如下所示
private void Insert_Click(object sender, EventArgs e)
{
int index = this.dataGridView1.SelectedRows[this.dataGridView1.SelectedRows.Count-1].Index;
dataGridView1.DataSource = null;
ds.Tables[0].Rows.InsertAt(ds.Tables[0].NewRow(), index);
string sql = "SELECT * FROM [Employees];";
BLL.SqlHelper sh = new BLL.SqlHelper();
ds1 = sh.Select(sql);
//dataGridView1.DataSource = ds.Tables[0];
dataGridView1.DataSource = ds1.Tables[0];
dataGridView1.ClearSelection();
dataGridView1.Rows[index].Selected = true;
}