C# 创建新行后,在DataGridView中选择一个DataRow

C# 创建新行后,在DataGridView中选择一个DataRow,c#,postgresql,datagridview,C#,Postgresql,Datagridview,我使用PostgreSQL视图在DataGridView中显示数据: dataSource = new BindingSource(); dataSource.DataSource = Program.DB.GetView(dbView); // returns a DataTable dgData.DataSource = dataSource; protected void RefreshData() { dataSource.DataSource = Program.DB.Ge

我使用PostgreSQL视图在
DataGridView
中显示数据:

dataSource = new BindingSource();
dataSource.DataSource = Program.DB.GetView(dbView);  // returns a DataTable
dgData.DataSource = dataSource;
protected void RefreshData() {
    dataSource.DataSource = Program.DB.GetView(dbView);
}
现在,在我使用PostgreSQL函数添加了一条记录之后,我刷新了网格中的数据(我不调用
Rows.Add()
DataGridView
上:

dataSource = new BindingSource();
dataSource.DataSource = Program.DB.GetView(dbView);  // returns a DataTable
dgData.DataSource = dataSource;
protected void RefreshData() {
    dataSource.DataSource = Program.DB.GetView(dbView);
}
PostgreSQL的插入函数返回插入行的ID,因此我知道ID(它是主键)并且想在
DataGridView
中将
Selected
设置为
true
。行可以位于集合中的任何位置,因为视图是按名称排序的,而不是按ID排序的。我想我可以通过在所有行上循环并在找到
Selected
时将其设置为true,但在大型数据集上这可能会变慢


是否有办法将数据源的行以某种方式绑定到datagrid?

将事件处理程序添加到
ListChanged
事件:

dataSource.ListChanged += dataSource_ListChanged;
以下是事件处理程序定义:

void dataSource_ListChanged(object sender, ListChangedEventArgs e)
{
    if (dgData.Rows.Count > 0)
        dgData.CurrentCell = dgData.Rows[e.NewIndex].Cells[0];
}
[更新]

正如我在评论中所建议的,也许您不应该在每次插入(或更新)时重新填充数据源。为了证明我的观点,我将发布一个代码示例,它使用一个
DataGridView
、2个
文本框
和2个
按钮(用于插入和更新)以及一个
SqlDataAdapter
。SQL表有两列(
id
value

以下是代码(我没有涉及删除):

公共部分类表单1:表单
{
静态绑定源数据源;
静态字符串dbView=“default”;
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
dgData.MultiSelect=false;
dataSource=新的BindingSource();
dataSource.ListChanged+=dataSource\u ListChanged;
刷新数据();
dgData.DataSource=数据源;
dgData.Sort(dgData.Columns[1],ListSortDirection.升序);
}
无效数据源\u ListChanged(对象发送方,ListChangedEventArgs e)
{
如果(dgData.Rows.Count>0)
dgData.CurrentCell=dgData.Rows[e.NewIndex].Cells[0];
}
受保护的空刷新数据()
{
dataSource.dataSource=DB.GetView(dbView);
}
私有无效插入\单击(对象发送者,事件参数e)
{
DB.Insert(textBox1.Text);
刷新数据();
}
私有无效更新\u单击(对象发送者,事件参数e)
{
DB.UpdateRandomRow(textBox2.Text);
刷新数据();
}
}
据库类
{
静态数据表dt;
静态字符串conStr=“yourConnectionString”;
静态SqlDataAdapter\u适配器;
静态随机r=新随机(10);
公共静态SqlDataAdapter CreateSqlDataAdapter(SqlConnection连接)
{
_adapter=新的SqlDataAdapter();
_adapter.MissingSchemaAction=MissingSchemaAction.AddWithKey;
_adapter.SelectCommand=新建SqlCommand(
“从测试中选择*”,连接);
_adapter.InsertCommand=new-SqlCommand(
“插入测试(值)”+
“值(@value)”,连接);
_adapter.UpdateCommand=新的SqlCommand(
“更新测试集[值]=@value”+
“其中id=@id”,连接);
_adapter.InsertCommand.Parameters.Add(“@value”,
SqlDbType.NVarChar,50,“值”);
_adapter.UpdateCommand.Parameters.Add(“@id”,
SqlDbType.Int,4,“id”).SourceVersion=DataRowVersion.Current;
_adapter.UpdateCommand.Parameters.Add(“@value”,
SqlDbType.NVarChar,50,“值”).SourceVersion=DataRowVersion.Current;
返回适配器;
}
//随机更新,以演示动态
//重新定位
公共静态数据表UpdaterAndRow(字符串值)
{
var currentRandom=r.Next(dt.Rows.Count);
dt.行[currentRandom]。设置字段(1,值);
使用(var con=new SqlConnection(contr))
{
con.Open();
_适配器=CreateSqlDataAdapter(con);
_适配器更新(dt);
}
返回dt;
}
内部静态数据表GetView(字符串dbView)
{
如果(dt==null)
{
dt=新数据表();
使用(var con=new SqlConnection(contr))
{
con.Open();
_适配器=CreateSqlDataAdapter(con);
_适配器填充(dt);
}
}
返回dt;
}
内部静态空白插入(字符串值)
{
如果(dt==null)
GetView(“”);
var dr=dt.NewRow();
dr[1]=数值;
dt.Rows.Add(dr);
使用(var con=new SqlConnection(contr))
{
con.Open();
_适配器=CreateSqlDataAdapter(con);
_适配器更新(dt);
}
}
}

如果对其进行测试,您将看到问题中的请求在insert和update两个方面都得到了满足。另外,请注意性能改进,因为数据表不会在每个操作中重新创建。

列表更改
事件添加事件处理程序:

dataSource.ListChanged += dataSource_ListChanged;
以下是事件处理程序定义:

void dataSource_ListChanged(object sender, ListChangedEventArgs e)
{
    if (dgData.Rows.Count > 0)
        dgData.CurrentCell = dgData.Rows[e.NewIndex].Cells[0];
}
[更新]

正如我在评论中所建议的,也许您不应该在每次插入(或更新)时重新填充数据源。为了证明我的观点,我将发布一个代码示例,它使用一个
DataGridView
、2个
文本框
和2个
按钮(用于插入和更新)以及一个
SqlDataAdapter
。SQL表有两列(
id
value

以下是代码(我没有涉及删除):

公共部分类表单1:表单
{
静态绑定源数据源;
静态字符串dbView=“default”;
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
dgData.MultiSelect=false;
dataSource=新的BindingSource();
dataSource.ListChanged+=dataSource\u ListChanged;
刷新数据();
dgData.D