2

我有一个用 c# 编写的 winform 应用程序。在其中一个表格上,有一个名为“研究人员姓名”的组合框。它是使用来自名为“Researcher Info”的 MS Access 表中的 tableadapter 进行数据绑定的,该表具有“Researcher Name”和“Researcher Age”两列。研究人员姓名是主键。

运行创建的 exe 文件时,在此组合框中选择任何值(仅选择,此处没有发生 db 读/写,除了使在选择更改事件上运行的按钮可见之外,我没有代码),它抛出下面的异常,说选定的组合框项目已经存在。有趣的是,我只选择一个值,而不是在数据库中输入值。

在此处输入图像描述

但它在 Visual Studio 调试模式下工作正常。即:做同样的事情不会抛出异常..

对于这个特定的活动没有太多的代码可以显示,但是这里有:

//页面加载时,表格适配器填充组合框

private void editstaffdetails_Load(object sender, EventArgs e)
{     this.researcher_InfoTableAdapter.Fill(this.research_Log_DatabaseDataSet1.Researcher_Info);

  researcher_NameComboBox.SelectedIndex = -1;

  Delete_btn.Visible = false;
  Update_btn.Visible = false;
}

 private void researcher_NameComboBox_SelectedIndexChanged(object sender, EventArgs e)
 {
   try
   { 
     Update_btn.Visible = true;
     Delete_btn.Visible = true;
   }
   catch (Exception ex)
   {
     MessageBox.Show(ex.ToString());
   }
 }

这是表格适配器的Fill方法的代码,它是默认生成的。

this.researcher_InfoTableAdapter.Fill(this.research_Log_DatabaseDataSet1.Researcher_Info);

public virtual int Fill(Research_Log_DatabaseDataSet1.Researcher_InfoDataTable dataTable)

{

this.Adapter.SelectCommand = this.CommandCollection[0];

        if ((this.ClearBeforeFill == true)) 

        {  dataTable.Clear();  }

        int returnValue = this.Adapter.Fill(dataTable);
        return returnValue; }

这是异常堆栈跟踪:

************** 异常文本 **************

System.Data.ConstraintException:列“研究人员姓名”被限制为唯一。价值“Kwek Gwen”已经存在。
在 System.Data.UniqueConstraint.CheckConstraint(DataRow 行,DataRowAction 操作)
在 System.Data.DataTable.RaiseRowChanging(DataRowChangeEventArgs 参数,DataRow eRow,DataRowAction eAction,布尔 fireEvent)
在 System.Data.DataTable.SetNewRecordWorker(DataRow 行,Int32 建议记录, DataRowAction 操作, Boolean isInMerge, Int32 位置, Boolean fireEvent, Exception& deferredException)
at System.Data.DataTable.SetNewRecord(DataRow row, Int32提出记录, DataRowAction action, Boolean isInMerge, Boolean fireEvent)
at System.Data.DataRow.SetNewRecord(Int32记录)
在 System.Data.DataRow.EndEdit()
在 System.Data.DataRowView.EndEdit() 在 System.Windows.Forms.CurrencyManager.EndCurrentEdit()
在 System.Windows.Forms.CurrencyManager.ChangeRecordState(Int32 newPosition,布尔验证,布尔 endCurrentEdit,布尔 firePositionChange,布尔 pullData)
在系统.Windows.Forms.CurrencyManager.set_Position(Int32 value)
在 System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)
在 System.Windows.Forms.ComboBox.WmReflectCommand(Message& m)
在 System.Windows.Forms.ComboBox.WndProc (Message& m)
在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

这是调试输出窗口显示的内容,在组合框单击事件期间启用了所有异常

线程“vshost.LoadReference”(0x15f0)已退出,代码为 0(0x0)。“WindowsFormsApplication1.vshost.exe”(托管 (v2.0.50727)):已加载“C:\Users\jollyk\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Release\WindowsFormsApplication1.exe”,已加载符号。'WindowsFormsApplication1.vshost.exe'(托管 (v2.0.50727)):已加载 'C:\windows\assembly\GAC_MSIL\Accessibility\2.0.0.0__b03f5f7f11d50a3a\Accessibility.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。'WindowsFormsApplication1.vshost.exe'(托管 (v2.0.50727)):已加载 'C:\windows\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。'WindowsFormsApplication1.vshost.exe'(托管 (v2.0.50727)):已加载 'C:\windows\assembly\GAC_32\System.Transactions\2.0.0.0__b77a5c561934e089\System.Transactions.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。“WindowsFormsApplication1.vshost.exe”(托管 (v2.0.50727)):已加载“C:\windows\assembly\GAC_32\System.EnterpriseServices\2.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll”,跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。'WindowsFormsApplication1.vshost.exe'(托管 (v2.0.50727)):已加载 'C:\windows\assembly\GAC_32\System.EnterpriseServices\2.0.0。0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll',跳过加载符号。模块已优化,调试器选项“仅我的代码”已启用。线程 '' (0x1248) 以代码 0 (0x0) 退出。线程 '' (0xd84) 以代码 0 (0x0) 退出。步入:步入非用户代码“System.Windows.Forms.ComboBox.OnSelectedIndexChanged”步入:步入非用户代码“System.Windows.Forms.NativeWindow.DebuggableCallback”步入:步入非用户代码“ System.Windows.Forms.Control.ReflectMessageInternal 步入:跨过非用户代码“System.Windows.Forms.Control.WmCommand” 步入:跨过非用户代码“System.Windows.Forms.Control.WndProc”步入:跨过非用户代码“System.Windows.Forms.

任何帮助表示赞赏。

4

2 回答 2

1

我删除了表适配器并创建了一个新的,现在它可以工作了。然而,没有设法弄清楚第一个有什么问题。我已经完成了表格适配器,下次我编写代码时。

于 2013-05-31T02:14:10.073 回答
0

Looking at the Stack Trace, when you change the Combobox selection it's (apparently) causing a change to the row in the dataset, and the data binding is attempting to repopulate the Combobox row accordingly. So maybe you have a property of the Combobox set to re-validate the data on selection, or perhaps the data binding object is re-validating when the selection changes?

于 2013-05-30T08:57:26.380 回答