如何在c#中从另一个窗体中运行方法?
本文关键字:窗体 运行 方法 另一个 | 更新日期: 2023-09-27 18:04:08
我在一个名为Products的表单中有一个"addEngine"方法,我有一个"Add New Engine"按钮。
public partial class Products : Form
{
public void addEngine(short EngineID, string NumberPerUnit, string Manufacturer, string ModelSeriesYear)
{
try
{
productCurrentRow = ((DataRowView) productEngineBindingSource.Current).Row;
int productID = (int) productCurrentRow["ProductID"];
var engines = from engine in productDataset.ProductEngine
where engine.ProductID == productID
select engine;
foreach (var engine in engines)
{
if (engine.EngineID == EngineID)
{
UC.alertError("Record already exists!");
return;
}
}
var newEngineRow = productDataset.ProductEngine.NewProductEngineRow();
newEngineRow.EngineID = EngineID;
newEngineRow.ProductID = productID;
newEngineRow.NumberPerUnit = NumberPerUnit;
newEngineRow.Manufacturer = Manufacturer;
newEngineRow.ModelSeriesYear = ModelSeriesYear;
productDataset.ProductEngine.AddProductEngineRow(newEngineRow);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnAddNewEngine_Clicked(object sender, EventArgs e)
{
EngineFilter eginfilter = new EngineFilter();
eginfilter.ShowDialog();
}
}
当按钮被点击时,会出现另一个名为"engineeffilter"的表单,它会加载一个引擎列表。当用户从列表中选择一个项目并单击表单上的"Select"按钮后,该项目的信息将通过"Product"表单上的"addEngine"方法插入到列表(productenengine数据表)中。问题是我不能在两个窗体(类)之间传递参数
public partial class EngineFilter : Form
{
public delegate void addEnineDelegate(short EngineID, string NumberPerUnit, string Manufacturer, string ModelSeriesYear);
private void btnSelect_Click(object sender, EventArgs e)
{
Products product = new Products();
DataRow row = ((DataRowView) engineFilterBindingSource.Current).Row;
addEnineDelegate mydelegate = new addEnineDelegate(product.addEngineMethod);
mydelegate((short)row[2], "1", row[0].ToString(), row[1].ToString());
this.Close();
}
}
我已经尝试使用委托,但有一个"对象引用未设置为对象的实例"错误。有没有人能给我一些处理这个问题的好方法?
您可以将包含addEngine方法的表单的引用传递给要从中调用此方法的表单,这将有效,但不是一个特别好的解决方案。
最好是有一个类来公开这个方法,然后将这个类的实例传递给两个表单供它们使用。这样可以更好地分离关注点。实际上,您的表单不应该负责更新存储库,它应该做的是收集用户输入并将其传递给负责更新的类。
我同意Sam Holder的观点,但如果你想让这段代码像现在这样工作,我会使用事件。
在engineefilter中创建事件
Public event EventHandler<EngineFilterEventArgs> EngineFilterSelected;
现在第二步是创建EngineFilterEventArgs类,并把你想要的每个参数放在eventargs中。现在我刚刚添加了一个ID
Public class EngineFilterEventArgs : EventArgs
{
Public int Id {get; set;}
Public EngineFilterEventArgs(int id)
{
Id = id;
}
}
第三步是触发事件。注意,1被选中
If(EngineFilterSelected != null)
EngineFilterSelected(this, new EngineFilterEventArgs(1));
现在确保另一个表单正在监听事件。
private void btnAddNewEngine_Clicked(object sender, EventArgs e)
{
EngineFilter enginFilter = new EngineFilter();
engineFilter.EngineFilterSelected += handler;
engineFilter.ShowDialog();
}
最后一步是添加eventandler
Protected void handler(object sender, EngineFilterEventArgs e)
{
//TODO Handle your event
Int selectedId = e.Id;
}