myDataSet.GetChanges().Tables[myDataMember].Rows[0]["fill_time"]不等于this.myDataSet.Tables[myDataMember].Rows[當前修改行]["fill_time"]

cnjack 2008-04-01 04:57:23
DataGrid中的ColumnChanging事件代碼如下:
private void DataColumn_ColumnChanging(object sender,System.Data.DataColumnChangeEventArgs e)
{
#region 輸入資料檢測
try
{
if(this.dataCenter1.EditModel && ("Empl_Code,tmpTime").ToLower().IndexOf(e.Column.ColumnName.ToLower())>=0)
{
if(e.Row[e.Column.ColumnName,(e.Row.RowState==DataRowState.Detached?DataRowVersion.Proposed:(e.Row.RowState==DataRowState.Added?DataRowVersion.Default:DataRowVersion.Original))]!=e.ProposedValue)
{
//是否恢複表格的值
bool ifRestore=false;
switch(e.Column.ColumnName.ToLower())
{
case "empl_code":
#region 工號/姓名/系統編號檢測
if(e.ProposedValue.Equals(DBNull.Value) || e.ProposedValue.ToString().Equals(string.Empty))
{
MessageBox.Show("<工號>不可以為空!","Information",MessageBoxButtons.OK,MessageBoxIcon.Information);
SendKeys.Send("+{Tab}");//將光標返回到當前列
ifRestore=true;
}
else
{
string selectYM=GetFilterStringForEmployee();
DataRow[] dr=this.myDataSet.Tables["v_allempl"].Select(selectYM+" and ifexist=0 and (service_empl_code='"+e.ProposedValue.ToString().Trim()+"' or service_empl_name='"+e.ProposedValue.ToString().Trim()+"' or service_empl_index='"+e.ProposedValue.ToString().Trim()+"')");
if(dr.Length>0)
{
e.ProposedValue=dr[0]["service_empl_code"];
e.Row["empl_index"]=dr[0]["service_empl_index"];
if(e.Row.RowState==DataRowState.Detached)
e.Row["empl_name"]=dr[0]["service_empl_name"];
else
e.Row.EndEdit();
DateTime dt;
if(this.meTime.Value=="")
dt=this.GetDateTime(this.Year,this.Month,this.Day);
else
dt=this.GetDateTime(this.Year,this.Month,this.Day,this.meTime.Value.Substring(0,2),this.meTime.Value.Substring(2),0);
e.Row["tmpday"]=dt.Day;//第一次賦值
e.Row["fill_time"]=dt;
// e.Row["tmpTime"]=dt.ToString("HHmm");
SendKeys.Send("{Tab}");
}
else
{
MessageBox.Show("工號不存在!","Information",MessageBoxButtons.OK,MessageBoxIcon.Information);
SendKeys.Send("+{Tab}");//將光標返回到當前列
// ifRestore=true;
}
}
#endregion
break;
case "tmptime":
#region 時間檢測
if(e.ProposedValue.Equals(DBNull.Value) || e.ProposedValue.ToString().Equals(string.Empty))
{
e.ProposedValue=0;
}
else
{
if(this.checkHhMm(e.ProposedValue.ToString().Trim()))
{
DateTime dt=this.GetDateTime(this.Year,this.Month,this.Day,e.ProposedValue.ToString().Substring(0,2),e.ProposedValue.ToString().Substring(2),0);
e.Row["fill_time"]=dt;//第二次賦值后,e.Row["fill_time"]確實是為最新的值,即上一條語句中dt的值.
SendKeys.Send("{Tab}");
SendKeys.Send("{Tab}");
SendKeys.Send("{Tab}");
SendKeys.Send("{Tab}");
SendKeys.Send("{Tab}");
}
else
{
MessageBox.Show("輸入了錯誤的時間值<"+e.ProposedValue.ToString()+">!","Information",MessageBoxButtons.OK,MessageBoxIcon.Information);
SendKeys.Send("+{Tab}");//將光標返回到當前列
ifRestore=true;
}
}
#endregion
break;
}
if(ifRestore)
{
if(e.Row.RowState==DataRowState.Detached)
e.ProposedValue=e.Row[e.Column.ColumnName,DataRowVersion.Proposed];
else if(e.Row.RowState==DataRowState.Added)
e.ProposedValue=e.Row[e.Column.ColumnName];
else
e.ProposedValue=e.Row[e.Column.ColumnName,DataRowVersion.Original];
}
else
e.Row["Last_Edit"]=UserMethod.getLastEdit(e.Row.RowState.Equals(DataRowState.Added)?"Add":"Edit");
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
#endregion
}
說明:
1.fill_time為主鍵字段之一,且允許為DBNull.
2.DataSet有使用DataRelation

我增加一筆資料,在保存時,發現:
this.myDataSet.GetChanges().Tables[this.myDataMember].Rows[0]["fill_time"]不等于this.myDataSet.Tables[this.myDataMember].Rows[當前修改行]["fill_time"]
調試發現:
this.myDataSet.Tables[this.myDataMember].Rows[當前修改行]["fill_time"]中的"時間"為第二次給fill_time賦值時的時間

this.myDataSet.GetChanges().Tables[this.myDataMember].Rows[0]["fill_time"]中的"時間"為第二次給fill_time賦值時的時間

當我第一次不為fill_time賦值時,this.myDataSet.GetChanges()返回錯誤:"無法啟用條件約束。一或多個資料列的值違反非 Null、唯一或外部索引鍵條件約束。"
...全文
76 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wumingbing_8027 2008-04-07
  • 打赏
  • 举报
回复
好象是:
每个CELL有3个值,旧值,当前值,新值()
新增行插入数据库的是'新值'
而我们操作的是'当前值'
cnjack 2008-04-01
  • 打赏
  • 举报
回复
樓上的,怎么會這樣?
wumingbing_8027 2008-04-01
  • 打赏
  • 举报
回复
2003中当加一笔数据时,新数据不能被修改的(修改时不会报错,但不会起作用--查看时只会看到修改后的数据)

如果一定要这么做,可以先COPY一份,再AceptChanges,再insert先前COPY的

其它不知道是不是也有这种情况

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧