父子表关联在窗体中的绑定显示和浏览

     private BindingManagerBase bm1 = null;
private BindingManagerBase bm2 = null;

private void DataScanInForm2_Load(object sender, EventArgs e)
{
string sqlString1 = "select * from 客户";
string sqlString2 = "select * from 订单";
string[] sqlStrings = new string[] { sqlString1, sqlString2 };
string[] tableNames = new string[] { "客户", "订单" };

DataSet ds = new DataSet();
ds = Rabbit.DBUtility.DBHelperOLEDB.Query(sqlStrings, tableNames);

DataColumn parentColumn = new DataColumn();
DataColumn childColumn = new DataColumn();
parentColumn = ds.Tables["客户"].Columns["ID"];
childColumn = ds.Tables["订单"].Columns["客户 ID"];

DataRelation relation = new DataRelation("每一位客户的订单", parentColumn, childColumn);
ds.Relations.Add(relation);

//绑定
txtCID.DataBindings.Add("text", ds, "客户.ID");
txtCCompany.DataBindings.Add("text", ds, "客户.公司");
txtCFamliyName.DataBindings.Add("text", ds, "客户.姓氏");
txtCHomepage.DataBindings.Add("text", ds, "客户.主页");

txtOID.DataBindings.Add("text", ds, "客户.每一位客户的订单.订单 ID");
dtpODate.DataBindings.Add("value", ds, "客户.每一位客户的订单.订单日期");
txtOName.DataBindings.Add("text", ds, "客户.每一位客户的订单.发货名称");
txtOCity.DataBindings.Add("text", ds, "客户.每一位客户的订单.发货城市");
nudOCost.DataBindings.Add("value", ds, "客户.每一位客户的订单.运费");

Binding bTax = new Binding("text", ds, "客户.每一位客户的订单.税款");
bTax.Format += new ConvertEventHandler(bTax_Format); txtOTax.DataBindings.Add(bTax);


bm1 = this.BindingContext[ds, "客户"];
bm2 = this.BindingContext[ds, "客户.每一位客户的订单"];
bm1.PositionChanged += new EventHandler(bm1_PositionChanged);
bm2.PositionChanged += new EventHandler(bm2_PositionChanged);
this.bm1_PositionChanged(null, new EventArgs());
this.bm2_PositionChanged(null, new EventArgs());
}

private void bTax_Format(object sender, ConvertEventArgs e)
{
e.Value = string.Format("{0:c3}", (decimal)e.Value);
}

private void bm1_PositionChanged(object sender, EventArgs e)
{
textBox1.Text = string.Format("当前位置:{0},共计:{1}", bm1.Position + 1, bm1.Count);
this.bm2_PositionChanged(null, new EventArgs());
}

private void bm2_PositionChanged(object sender, EventArgs e)
{
//当bm1.Position改变时,先执行bm2.Position的PositionChanged事件,
//再执行bm1.Position的PositionChanged事件。而在执行bm2.Position的
//PositionChanged事件之前,bm2.Position已经指向了bm1.Position所指向
//记录的第一个子记录,即bm2.Position=0;如果没有子记录,则bm2.Position=-1

textBox2.Text = string.Format("当前位置:{0},共计:{1}", bm2.Position + 1, bm2.Count);
}

private void btnCBack_Click(object sender, EventArgs e)
{
if (bm1.Position > 0)
{
bm1.Position -= 1;
}
}

private void btnCNext_Click(object sender, EventArgs e)
{
if (bm1.Position < bm1.Count - 1)
{
bm1.Position += 1;
}
}

private void btnCFirst_Click(object sender, EventArgs e)
{
bm1.Position = 0;
}

private void btnCLast_Click(object sender, EventArgs e)
{
bm1.Position = bm1.Count - 1;
}

private void btnOBack_Click(object sender, EventArgs e)
{
if (bm2.Position > 0)
{
bm2.Position -= 1;
}
}

private void btnONext_Click(object sender, EventArgs e)
{
if (bm2.Position < bm2.Count - 1)
       {
          //当下一记录的数据无法通过与之绑定的控件的有效性检验时,
         //将会导致指向下一记录失败,即下式计算失败,bm2.Position保持不变
               //例如,图中有一个显示运费的NumericUpDown控件,如果下一记录的运费
               //为300,而该控件的MaxValue属性值为200,则将会导致指向失败
                bm2.Position += 1;
}
}

private void btnOFirst_Click(object sender, EventArgs e)
{
bm2.Position = 0;
}

private void btnOLast_Click(object sender, EventArgs e)
{
bm2.Position = bm2.Count - 1;
}

原文地址:https://www.cnblogs.com/2008freestyle/p/2406063.html