簡體   English   中英

如何從c#中的另一個winform運行方法?

[英]How can I run a method from a another winform in c#?

我有一個名為Products的形式的“addEngine”方法,我有一個“添加新引擎”按鈕。

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();
    }
}

單擊按鈕時,會有另一個名為“EngineFilter”的表單,它會加載列表Engines。 用戶從列表中選擇一個項目並單擊表單上的“選擇”按鈕后,該項目的信息將通過“產品”表單上的“addEngine”方法插入一個列表(ProductEngine datatable)。 問題是我無法在兩個表單(類)之間傳遞參數

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();
    }
}

我試圖使用委托,但有一個“對象引用沒有設置為對象的實例”錯誤。 有沒有人可以給我一個好的做法來處理這個問題?

我與Sam Holder簽約,但是如果你想讓這段代碼正常工作,我會使用事件。

在EngineFilter中創建您的活動

Public event EventHandler<EngineFilterEventArgs> EngineFilterSelected;

現在第二步是創建EngineFilterEventArgs類並將所需的每個參數放在eventargs中。 現在我剛剛添加了一個ID

Public class EngineFilterEventArgs : EventArgs
{
    Public int Id {get; set;}
    Public EngineFilterEventArgs(int id)
    {
        Id = id;
    }
}

第三步是開火活動。 注意1是selectedId

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();
    }

最后一步是添加你的事件處理程序

Protected void handler(object sender, EngineFilterEventArgs e)
{
    //TODO Handle your event
    Int selectedId = e.Id;
}

您可以將包含addEngine方法的表單的引用傳遞給您要調用此方法的表單,這樣可以使用,但這不是一個特別好的解決方案。

更好的方法是有一個暴露這個方法的類,然后將這個類的實例傳遞給兩個表單供他們使用。 這有更好的關注點分離。 實際上,您的表單不應該負責更新存儲庫,它應該做的是收集用戶輸入並將其傳遞給負責執行更新的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM