上面是用VS.NET的"数据窗体向导"自动生成的窗体.但是,我们从其中生成的代码里可以学到很多东西.
下面,我们会一个个按钮的代码进行讲解:
btnLoad(加载):
private
void
btnLoad_Click(
object
sender, System.EventArgs e)

{
try

{
// 尝试加载数据集。
this.LoadDataSet();
}
catch (System.Exception eLoad)

{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eLoad.Message);
}
this.objjobDataSet_PositionChanged();

}

public
void
LoadDataSet()

{
// 创建一个新数据集以保存从 FillDataSet 调用返回的记录。
// 使用了一个临时数据集,这是因为填充现有的数据集
// 需要重新绑定数据绑定。
Car.jobDataSet objDataSetTemp;
objDataSetTemp = new Car.jobDataSet();
try

{
// 尝试填充临时数据集。
this.FillDataSet(objDataSetTemp);
}
catch (System.Exception eFillDataSet)

{
// 在此处添加错误处理代码。
throw eFillDataSet;
}
try

{
// 清空数据集中的旧记录。
objjobDataSet.Clear();
// 将记录合并到主数据集中。
objjobDataSet.Merge(objDataSetTemp);
}
catch (System.Exception eLoadMerge)

{
// 在此处添加错误处理代码。
throw eLoadMerge;
}

}

public
void
FillDataSet(Car.jobDataSet dataSet)

{
// 在填充数据集前关闭约束检查。
// 这允许适配器填充数据集而不用考虑
// 表之间的依赖项。
dataSet.EnforceConstraints = false;
try

{
// 打开连接。
this.oleDbConnection1.Open();
// 尝试通过 OleDbDataAdapter1 填充数据集。
this.oleDbDataAdapter1.Fill(dataSet);
}
catch (System.Exception fillException)

{
// 在此处添加错误处理代码。
throw fillException;
}
finally

{
// 重新打开约束检查。
dataSet.EnforceConstraints = true;
// 无论是否引发了异常都关闭连接。
this.oleDbConnection1.Close();
}

}
btnUpdate(更新):
private
void
btnUpdate_Click(
object
sender, System.EventArgs e)

{
try

{
// 尝试更新数据源。
this.UpdateDataSet();
}
catch (System.Exception eUpdate)

{
// 在此处添加错误处理代码。
// 显示错误信息(如果有)。
System.Windows.Forms.MessageBox.Show(eUpdate.Message);
}
this.objjobDataSet_PositionChanged();

}

public
void
UpdateDataSet()

{
// 创建一个新数据集来保存对主数据集所做的更改。
Car.jobDataSet objDataSetChanges = new Car.jobDataSet();
// 停止当前的任何编辑。
this.BindingContext[objjobDataSet,"tblJobDetails"].EndCurrentEdit();
// 获取对主数据集所做的更改。
objDataSetChanges = ((Car.jobDataSet)(objjobDataSet.GetChanges()));
// 检查是否做了任何更改。
if ((objDataSetChanges != null))

{
try

{
// 需要做一些更改,所以尝试通过调用 update 方法
// 和传递数据集以及任何参数来更新数据源。
this.UpdateDataSource(objDataSetChanges);
objjobDataSet.Merge(objDataSetChanges);
objjobDataSet.AcceptChanges();
}
catch (System.Exception eUpdate)

{
// 在此处添加错误处理代码。
throw eUpdate;
}
// 添加代码以检查返回的数据集中是否有任何可能已被
// 推入到行对象错误中的错误。
}

}

public
void
UpdateDataSource(Car.jobDataSet ChangedRows)

{
try

{
// 在有挂起的更改时,只需要更新数据源即可。
if ((ChangedRows != null))

{
// 打开连接。
this.oleDbConnection1.Open();
// 尝试更新数据源。
oleDbDataAdapter1.Update(ChangedRows);
}
}
catch (System.Exception updateException)

{
// 在此处添加错误处理代码。
throw updateException;
}
finally

{
// 无论是否引发了异常都关闭连接。
this.oleDbConnection1.Close();
}

}
btnCancelAll:(全部取消)
private
void
btnCancelAll_Click(
object
sender, System.EventArgs e)

{
this.objjobDataSet.RejectChanges();

}
btnAdd(添加记录):
private
void
btnAdd_Click(
object
sender, System.EventArgs e)

{
try

{
// 清除当前编辑内容
this.BindingContext[objjobDataSet,"tblJobDetails"].EndCurrentEdit();
this.BindingContext[objjobDataSet,"tblJobDetails"].AddNew();
}
catch (System.Exception eEndEdit)

{
System.Windows.Forms.MessageBox.Show(eEndEdit.Message);
}
this.objjobDataSet_PositionChanged();

}
btnDelete(删除记录):
private
void
btnDelete_Click(
object
sender, System.EventArgs e)

{
if ((this.BindingContext[objjobDataSet,"tblJobDetails"].Count > 0))

{
this.BindingContext[objjobDataSet,"tblJobDetails"].RemoveAt(this.BindingContext[objjobDataSet,"tblJobDetails"].Position);
this.objjobDataSet_PositionChanged();
}

}
btnCancel(取消):
private
void
btnCancel_Click(
object
sender, System.EventArgs e)

{
this.BindingContext[objjobDataSet,"tblJobDetails"].CancelCurrentEdit();
this.objjobDataSet_PositionChanged();

}
几个移动记录按钮集合:
private
void
btnNavFirst_Click(
object
sender, System.EventArgs e)

{
this.BindingContext[objjobDataSet,"tblJobDetails"].Position = 0;
this.objjobDataSet_PositionChanged();

}

private
void
btnNavPrev_Click(
object
sender, System.EventArgs e)

{
this.BindingContext[objjobDataSet,"tblJobDetails"].Position = (this.BindingContext[objjobDataSet,"tblJobDetails"].Position - 1);
this.objjobDataSet_PositionChanged();

}

private
void
btnNavNext_Click(
object
sender, System.EventArgs e)

{
this.BindingContext[objjobDataSet,"tblJobDetails"].Position = (this.BindingContext[objjobDataSet,"tblJobDetails"].Position + 1);
this.objjobDataSet_PositionChanged();

}

private
void
btnLast_Click(
object
sender, System.EventArgs e)

{
this.BindingContext[objjobDataSet,"tblJobDetails"].Position = (this.objjobDataSet.Tables["tblJobDetails"].Rows.Count - 1);
this.objjobDataSet_PositionChanged();

}
objjobDataSet_PositionChanged方法只是显示页数的视觉操作:
private
void
objjobDataSet_PositionChanged()

{
this.lblNavLocation.Text = ((((this.BindingContext[objjobDataSet,"tblJobDetails"].Position + 1)).ToString() + " 的 ")
+ this.BindingContext[objjobDataSet,"tblJobDetails"].Count.ToString());

}