我有一个tableadapter,我想在触发RowUpdated事件时做一些事情。我无法弄清楚将代码添加到事件的位置。
public partial class MyTableAdapter
{
void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
{
}
}
如何在创建TableAdapter时运行以下代码?
Adapter.RowUpdated +=
new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
答案 0 :(得分:3)
我分两个阶段解决了这个问题。
一个。添加部分类和扩展表适配器
湾在使用此适配器之前调用一个方法(在创建它的实例后以主窗体表示)。
下面的代码是为了解决SQL CE的特定问题,以便能够更新表上的ID。但是,您可以使用扩展方法来包装RowUpdated事件并将其公开给其他类(即MyRowUpdated)
扩展名
public partial class ScannedItemsTableAdapter
{
public void InitEvents()
{
this._adapter.RowUpdated += _adapter_RowUpdated;
}
void _adapter_RowUpdated(object sender, SqlCeRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue &&
e.StatementType == StatementType.Insert)
{
var pk = e.Row.Table.PrimaryKey;
pk[0].ReadOnly = false;
SqlCeCommand cmd = new SqlCeCommand("SELECT @@IDENTITY",
e.Command.Connection, e.Command.Transaction);
object id = (decimal)cmd.ExecuteScalar();
e.Row[pk[0]] = Convert.ToInt32(id);
e.Row.AcceptChanges();
}
}
}
主要表格中的电话:
tableAdapter = new ScannedItemsTableAdapter();
tableAdapter.Fill(ds.ScannedItems);
tableAdapter.InitEvents();
答案 1 :(得分:1)
我有一个可能的选择。
虽然可以在tableadapter分部类中订阅tableadapters底层适配器,但我发现你不能轻易地初始化它而不必记住调用你自己的初始化。
但是我发现我可以使用tableadpater直接在代码中订阅tableadapters.adapter.rowupdated事件,如下所示
AddHandler Me.TA_Case_Transactions.Adapter.RowUpdated, AddressOf Transaction_Row_Written
Private Sub Transaction_Row_Written(p_Sender As Object, p_E As SqlRowUpdatedEventArgs)
beep
End Sub
"发出哔哔声,我可以添加断点进行测试"
因为无论如何我必须订阅该活动,我认为这更直观,并且不需要任何"记住"
答案 2 :(得分:0)
编辑:显然,以下建议的步骤都没有用。我在这里完全保留这个答案,以便其他任何试图回答它的人都没有提出相同的建议。< / p>
您是否在设计师中创建了TableAdapter
?如果是这样,您是否可以单击属性页面的“事件”部分,并在RowUpdated
条目中键入“OnRowUpdated”?
如果您在代码中明确创建适配器,只需自己添加呼叫。
或者,你的部分类是否有一个被调用的构造函数?如果是这样,你可以在那里添加呼叫。
编辑:好的,所以可能是在特定的页面或表单中使用了 - 你可以在该页面/表单的InitializeComponent
方法之后添加吗?
答案 3 :(得分:0)
http://windowsclient.net/learn/video.aspx?v=14625如果你看一下这个视频,你可以看到,你只需双击数据集设计器中的某些东西,就可以为你生成和连接事件......但是这只适用于VB程序员:))sux
答案 4 :(得分:0)
自从我上次使用这个东西已经有一段时间了,但是如果我没记错的话,你应该能够在你的部分类中覆盖EndInit()
并添加初始代码,比如在那里添加你的事件处理程序......
答案 5 :(得分:0)
从那里覆盖你的C#类和fire事件处理程序
public override void EndInit()
{
base.EndInit();
Adapter.RowUpdated +=
new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
}
void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
{
}
希望有帮助................
答案 6 :(得分:0)
// Assumes that connection is a valid SqlConnection object.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", connection);
// Add handlers.
custAdapter.RowUpdating += new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);
// Set DataAdapter command properties, fill DataSet, modify DataSet.
custAdapter.Update(custDS, "Customers");
// Remove handlers.
custAdapter.RowUpdating -= new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(OnRowUpdated);
protected static void OnRowUpdating(
object sender, SqlRowUpdatingEventArgs args)
{
if (args.StatementType == StatementType.Delete)
{
System.IO.TextWriter tw = System.IO.File.AppendText("Deletes.log");
tw.WriteLine(
"{0}: Customer {1} Deleted.", DateTime.Now,
args.Row["CustomerID", DataRowVersion.Original]);
tw.Close();
}
}
protected static void OnRowUpdated(
object sender, SqlRowUpdatedEventArgs args)
{
if (args.Status == UpdateStatus.ErrorsOccurred)
{
args.Row.RowError = args.Errors.Message;
args.Status = UpdateStatus.SkipCurrentRow;
}
}
答案 7 :(得分:0)
这是一个简单的方法,使用设计器。右键单击数据集(.xsd 文件)并选择查看代码。就像使用表单一样,它不会打开设计器代码。它会打开你的代码。这是您的代码:
namespace TimeTrack.TimeTrackDataSetTableAdapters
{
public partial class TimeSlipsTableAdapter
{
public void CustomSetup()
{
Adapter.RowUpdated += Adapter_RowUpdated;
}
private void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
{
// whatever you want to do when RowUpdated fires
}
}
}
在您的表单中,不要忘记
public TimeEntry()
{
InitializeComponent();
timeSlipsTableAdapter.CustomSetup();