C# Winforms bindingsource添加新记录时出现问题
我有以下代码来加载绑定数据到主细节窗口,其中主数据绑定到文本框和其他控件,细节数据绑定到DataGridView: 在表单加载时:C# Winforms bindingsource添加新记录时出现问题,c#,winforms,datagridview,dataset,bindingsource,C#,Winforms,Datagridview,Dataset,Bindingsource,我有以下代码来加载绑定数据到主细节窗口,其中主数据绑定到文本框和其他控件,细节数据绑定到DataGridView: 在表单加载时: DataSet dsOrders = new DataSet("dsOrders"); SqlDataAdapter daOrderHeader;// = new SqlDataAdapter(); SqlDataAdapter daOrderDetail;// = new SqlDataAdapter();
DataSet dsOrders = new DataSet("dsOrders");
SqlDataAdapter daOrderHeader;// = new SqlDataAdapter();
SqlDataAdapter daOrderDetail;// = new SqlDataAdapter();
BindingSource bsOrderHeader = new BindingSource();
BindingSource bsOrderDetail = new BindingSource();
DataTable dtOrderHeader = new DataTable("dtOrderHeader");
DataTable dtOrderDetail = new DataTable("dtOrderDetail");
dsOrders.Tables.Add(dtOrderHeader);
dsOrders.Tables.Add(dtOrderDetail);
daOrderHeader = DataAdapterOrderHeader();
daOrderDetail = DataAdapterOrderDetail();
daOrderHeader.Fill(dtOrderHeader);
daOrderDetail.Fill(dtOrderDetail);
////Set up a master-detail relationship between the DataTables
DataColumn keyOrderHeaderColumn = dsOrders.Tables["dtOrderHeader"].Columns["ID"];
DataColumn foreignKeyOrderDetailColumn = dsOrders.Tables["dtOrderDetail"].Columns["OrderId"];
dsOrders.Relations.Add("rOrders", keyOrderHeaderColumn, foreignKeyOrderDetailColumn);
bsOrderHeader.DataSource = dsOrders;
bsOrderHeader.DataMember = "dtOrderHeader";
bsOrderDetail.DataSource = bsOrderHeader;
bsOrderDetail.DataMember = "rOrders";
tbxOrderNo.DataBindings.Add("Text", bsOrderHeader, "ID");
tbxCustomer.DataBindings.Add("Text", bsOrderHeader, "Name");
tbxTaxRate.DataBindings.Add("Text", bsOrderHeader, "TaxRate");
tbxShipping.DataBindings.Add("Text", bsOrderHeader, "Shipping");
tbxExchangeRate.DataBindings.Add("Text", bsOrderHeader, "ExchangeRate");
dtpOrderDate.DataBindings.Add("Text", bsOrderHeader, "OrderDate");
cbxPriceCode.DataBindings.Add("SelectedIndex", bsOrderHeader, "PriceCode");
dgvItems.DataSource = bsOrderDetail;
enter code here
在添加新记录时:
DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow();
drOrderHeader["ID"] = (maxID + 1);
dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader);
DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow();
drOrderDetail["OrderId"] = (maxID + 1);
dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail);
bsOrderHeader.DataSource = dsOrders.Tables["dtOrderHeader"];
bsOrderDetail.DataSource = dsOrders.Tables["dtOrderDetail"];
单击“添加新行”按钮时,bindingsource.count属性显示已添加新记录,但winform控件保留在同一记录上,并且我无法滚动到新创建的记录,bindingsource.movelast也停止工作
有什么建议吗?我需要的是滚动到新添加的记录/行,清除所有winform文本框,并准备输入新记录的数据,但我在创建时生成的OrderId和此代码中的OrderId除外
更新:对“添加”按钮进行了更改,但未成功
newOrderId = Convert.ToInt32(dsOrders.Tables["dtOrderHeader"].Compute("max(ID)", string.Empty)) + 1;
DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow();
drOrderHeader["ID"] = (newOrderId);
dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader);
DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow();
drOrderDetail["OrderId"] = (newOrderId);
dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail);
bsOrderHeader.Position = bsOrderHeader.Find("ID", newOrderId);
正如您已经发现的,数据绑定检测您在基础数据源中所做的更改,因此有以下两行:
bsOrderHeader.DataSource = dsOrders.Tables["dtOrderHeader"];
bsOrderDetail.DataSource = dsOrders.Tables["dtOrderDetail"];
它们是多余的。不仅如此,第二个错误地更改了bsOrderDetail
的数据源类型。因此,只需删除它们
要将UI重新绑定到新添加的记录,只需将bsOrderHeader
的属性设置为新记录的索引,如下所示:
bsOrderHeader.Position = bsOrderHeader.Find("ID", drOrderHeader["ID"]);
数据绑定基础设施将自动重新绑定主控件和(通过DataRelation
)详细网格视图
编辑:这里是完整的工作演示。如果您的代码在更新后不起作用,那么应该是由于文章中未显示的其他代码部分造成的
using System;
using System.Data;
using System.Windows.Forms;
namespace Samples
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form();
DataSet dsOrders = new DataSet("dsOrders");
//SqlDataAdapter daOrderHeader;// = new SqlDataAdapter();
//SqlDataAdapter daOrderDetail;// = new SqlDataAdapter();
BindingSource bsOrderHeader = new BindingSource();
BindingSource bsOrderDetail = new BindingSource();
DataTable dtOrderHeader = new DataTable("dtOrderHeader");
DataTable dtOrderDetail = new DataTable("dtOrderDetail");
dsOrders.Tables.Add(dtOrderHeader);
dsOrders.Tables.Add(dtOrderDetail);
//daOrderHeader = DataAdapterOrderHeader();
//daOrderDetail = DataAdapterOrderDetail();
//daOrderHeader.Fill(dtOrderHeader);
//daOrderDetail.Fill(dtOrderDetail);
dtOrderHeader.Columns.Add("ID", typeof(int));
dtOrderHeader.Columns.Add("Name", typeof(string));
dtOrderHeader.Columns.Add("TaxRate", typeof(decimal));
dtOrderHeader.Columns.Add("Shipping", typeof(string));
dtOrderHeader.Columns.Add("ExchangeRate", typeof(decimal));
dtOrderHeader.Columns.Add("OrderDate", typeof(DateTime));
dtOrderHeader.Columns.Add("PriceCode", typeof(int));
dtOrderHeader.PrimaryKey = new[] { dtOrderHeader.Columns["ID"] };
dtOrderDetail.Columns.Add("OrderId", typeof(int));
dtOrderDetail.Columns.Add("Quantity", typeof(decimal));
////Set up a master-detail relationship between the DataTables
DataColumn keyOrderHeaderColumn = dsOrders.Tables["dtOrderHeader"].Columns["ID"];
DataColumn foreignKeyOrderDetailColumn = dsOrders.Tables["dtOrderDetail"].Columns["OrderId"];
var rel = dsOrders.Relations.Add("rOrders", keyOrderHeaderColumn, foreignKeyOrderDetailColumn);
bsOrderHeader.DataSource = dsOrders;
bsOrderHeader.DataMember = "dtOrderHeader";
bsOrderDetail.DataSource = bsOrderHeader;
bsOrderDetail.DataMember = "rOrders";
var splitView = new SplitContainer { Dock = DockStyle.Fill, Parent = form };
var tbxOrderNo = new TextBox();
var tbxCustomer = new TextBox();
var tbxTaxRate = new TextBox();
var tbxShipping = new TextBox();
var tbxExchangeRate = new TextBox();
var dtpOrderDate = new DateTimePicker();
int y = 8;
foreach (var c in new Control[] { tbxOrderNo, tbxCustomer, tbxTaxRate, tbxShipping, tbxExchangeRate, dtpOrderDate })
{
c.Top = y;
c.Left = 16;
splitView.Panel1.Controls.Add(c);
y = c.Bottom + 8;
}
var dgvItems = new DataGridView { Dock = DockStyle.Fill, Parent = splitView.Panel2 };
tbxOrderNo.DataBindings.Add("Text", bsOrderHeader, "ID");
tbxCustomer.DataBindings.Add("Text", bsOrderHeader, "Name");
tbxTaxRate.DataBindings.Add("Text", bsOrderHeader, "TaxRate");
tbxShipping.DataBindings.Add("Text", bsOrderHeader, "Shipping");
tbxExchangeRate.DataBindings.Add("Text", bsOrderHeader, "ExchangeRate");
dtpOrderDate.DataBindings.Add("Text", bsOrderHeader, "OrderDate");
//cbxPriceCode.DataBindings.Add("SelectedIndex", bsOrderHeader, "PriceCode");
dgvItems.DataSource = bsOrderDetail;
Func<DataRow> addOrder = () =>
{
var maxOrderId = dsOrders.Tables["dtOrderHeader"].Compute("max(ID)", string.Empty);
int newOrderId = (maxOrderId != null && maxOrderId != DBNull.Value ? Convert.ToInt32(maxOrderId) : 0) + 1;
DataRow drOrderHeader = dsOrders.Tables["dtOrderHeader"].NewRow();
drOrderHeader["ID"] = newOrderId;
dsOrders.Tables["dtOrderHeader"].Rows.Add(drOrderHeader);
DataRow drOrderDetail = dsOrders.Tables["dtOrderDetail"].NewRow();
drOrderDetail["OrderId"] = newOrderId;
dsOrders.Tables["dtOrderDetail"].Rows.Add(drOrderDetail);
return drOrderHeader;
};
for (int i = 0; i < 5; i++) addOrder();
var addButton = new Button { Dock = DockStyle.Bottom, Parent = form, Text = "Add" };
addButton.Click += (sender, e) =>
{
var drOrderHeader = addOrder();
bsOrderHeader.Position = bsOrderHeader.Find("ID", drOrderHeader["ID"]);
};
Application.Run(form);
}
}
}
使用系统;
使用系统数据;
使用System.Windows.Forms;
名称空间示例
{
静态类程序
{
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form=new form();
数据集dsOrders=新数据集(“dsOrders”);
//SqlDataAdapter daOrderHeader;/=新SqlDataAdapter();
//SqlDataAdapter DAORDERDEAIL;/=新SqlDataAdapter();
BindingSource bsOrderHeader=新BindingSource();
BindingSource bsOrderDetail=新BindingSource();
DataTable dtOrderHeader=新数据表(“dtOrderHeader”);
DataTable dtOrderDetail=新数据表(“dtOrderDetail”);
dsOrders.Tables.Add(dtOrderHeader);
dsOrders.Tables.Add(dtOrderDetail);
//daOrderHeader=DataAdapterOrderHeader();
//DAORDETAIL=DataAdapterOrdetail();
//daOrderHeader.Fill(dtOrderHeader);
//daOrderDetail.Fill(dtOrderDetail);
添加(“ID”,typeof(int));
添加(“名称”,typeof(字符串));
添加(“TaxRate”,typeof(decimal));
添加(“Shipping”,typeof(string));
添加(“ExchangeRate”,typeof(decimal));
添加(“OrderDate”,typeof(DateTime));
Add(“PriceCode”,typeof(int));
dtOrderHeader.PrimaryKey=new[]{dtOrderHeader.Columns[“ID”]};
Add(“OrderId”,typeof(int));
添加(“数量”,类型(十进制));
////在数据表之间设置主-明细关系
DataColumn keyOrderHeaderColumn=dsOrders.Tables[“dtOrderHeader”]。Columns[“ID”];
DataColumn foreignKeyOrderDetailColumn=dsOrders.Tables[“dtOrderDetail”]。Columns[“OrderId”];
var rel=dsOrders.Relations.Add(“rOrders”,keyOrderHeaderColumn,foreignKeyOrderDetailColumn);
bsOrderHeader.DataSource=dsOrders;
bsOrderHeader.DataMember=“dtOrderHeader”;
bsOrderDetail.DataSource=bsOrderHeader;
bsOrderDetail.DataMember=“rOrders”;
var splitView=newsplitcontainer{Dock=DockStyle.Fill,Parent=form};
var tbxOrderNo=新文本框();
var tbxCustomer=new TextBox();
var tbxTaxRate=new TextBox();
var tbxShipping=newtextbox();
var tbxExchangeRate=new TextBox();
var dtpOrderDate=新的日期时间选择器();
int y=8;
foreach(新控件中的变量c[]{tbxOrderNo,tbxCustomer,tbxTaxRate,tbxShipping,tbxExchangeRate,dtpOrderDate})
{
c、 Top=y;
c、 左=16;
splitView.Panel1.Controls.Add(c);
y=c.底部+8;
}
var dgvItems=newdatagridview{Dock=DockStyle.Fill,Parent=splitView.Panel2};
添加(“文本”,bsOrderHeader,“ID”);
tbxCustomer.DataBindings.Add(“Text”,bsOrderHeader,“Name”);
添加(“文本”,bsOrderHeader,“TaxRate”);
tbxShipping.DataBindings.Add(“Text”,bsOrderHeader,“Shipping”);
tbxExchangeRate.DataBindings.Add(“Text”,bsOrderHeader,“ExchangeRate”);
添加(“文本”,bsOrderHeader,“OrderDate”);
//添加(“SelectedIndex”,bsOrderHeader,“PriceCode”);
dgvItems.DataSource=bsOrderDetail;
Func addOrder=()=>
{
var maxOrderId=dsOrders.Tables[“dtOrderHeader”].Compute(“max(ID)”,string.Empty);
int newOrderId=(maxOrderId!=null&&maxOrderId!=DBNull.Value?Convert.ToInt32(maxOrderId):0)+1;
DataRow drOrderHeader=dsOrders.Tables[“dtOrderHeader”].NewRow();
drOrderHeader[“ID”]=newOrderId;
dsOrders.Tables[“dtOrderHeader”].Rows.Add(drOrderHeader);
DataRow drOrderDetail=dsOrders.Tables[“dtOrderDetail”].NewRow();
drOrderDetail[“OrderId”]=newOrderId;
dsOrders.Tables[“dtOrderDetail”].Rows.Add(d