gpt4 book ai didi

c# - Winforms 绑定(bind)源问题添加新记录

转载 作者:太空宇宙 更新时间:2023-11-03 15:22:52 25 4
gpt4 key购买 nike

我有以下代码将绑定(bind)数据加载到主从窗口,其中主数据绑定(bind)到文本框和其他控件,详细数据绑定(bind)到 DataGridView:

关于表单加载:

    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);

最佳答案

正如您已经发现的那样,数据绑定(bind)会检测您在基础数据源中所做的更改,因此是以下两行:

bsOrderHeader.DataSource = dsOrders.Tables["dtOrderHeader"];
bsOrderDetail.DataSource = dsOrders.Tables["dtOrderDetail"];

是多余的。不仅如此,第二个错误地更改了 bsOrderDetail 的数据源类型。所以简单地删除它们。

为了将 UI 重新绑定(bind)到新添加的记录,您只需设置 Position bsOrderHeader 的属性到新记录的索引,如下所示:

bsOrderHeader.Position = bsOrderHeader.Find("ID", drOrderHeader["ID"]);

并且数据绑定(bind)基础结构将自动重新绑定(bind)主控件和(通过 DataRelation)详细信息 GridView 。

编辑:这是完整的工作演示。如果您的代码在更新后无法正常工作,则应该是由帖子中未显示的其他代码部分引起的。

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);
}
}
}

关于c# - Winforms 绑定(bind)源问题添加新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36564652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com