如何在C#中正确传递输入参数给事件处理方法?

3

我在C#和.NET方面还比较新,遇到了以下问题。

我的代码中有如下内容:

Table table = new Table();

lstLabelType.SelectedIndexChanged += new System.EventHandler(SelectDocumentTypeChanged);

这是将事件处理程序附加到视图中的下拉元素。

因此,当用户更改此下拉菜单中选择的值时,将执行 SelectDocumentTypeChanged() 方法,如下所示:

private void SelectDocumentTypeChanged(object sender, EventArgs e)
{
    Debug.WriteLine("SelectDocumentTypeChanged() STARTED");

    SPWeb contextWeb = SPContext.Current.Web;

    DropDownList listaTipiDocumenti = (DropDownList)sender;
    tipoDocumentoSelezionato = listaTipiDocumenti.SelectedValue;
    this.renderizzaEtichetteFacoltative(tipoDocumentoSelezionato, table);

    string url = contextWeb.Url;
    string link = url + "/ARXEIA WEBPART/Stampa Etichetta.aspx?IsDlg=1&postazione=" + macchina + "&tipoDoc=" + tipoDocumentoSelezionato;
    SPUtility.Redirect(link, SPRedirectFlags.Default, Context);


}

现在我有一个问题。我必须将我代码中创建的Table table对象传递给此事件处理程序方法,因为我必须在此方法中使用它。
我该如何正确实现这种行为?当用户更改下拉列表中的值时,我该如何将此Table table对象传递给SelectDocumentTypeChanged()方法,因为该方法会自动调用?

选择文档类型是否与表格属于同一类? - Chetan
1个回答

6

尝试按照以下方式编写您的代码:

Table table = new Table();

lstLabelType.SelectedIndexChanged += (sender, e) =>
{
    Debug.WriteLine("SelectDocumentTypeChanged() STARTED");

    SPWeb contextWeb = SPContext.Current.Web;

    DropDownList listaTipiDocumenti = (DropDownList)sender;
    tipoDocumentoSelezionato = listaTipiDocumenti.SelectedValue;
    this.renderizzaEtichetteFacoltative(tipoDocumentoSelezionato, table);

    string url = contextWeb.Url;
    string link = url + "/ARXEIA WEBPART/Stampa Etichetta.aspx?IsDlg=1&postazione=" + macchina + "&tipoDoc=" + tipoDocumentoSelezionato;
    SPUtility.Redirect(link, SPRedirectFlags.Default, Context);
};

现在你可以直接在事件处理程序中使用table了。


你甚至可以忽略sender,像这样做:

lstLabelType.SelectedIndexChanged += (s, e) =>
{
    Debug.WriteLine("SelectDocumentTypeChanged() STARTED");

    SPWeb contextWeb = SPContext.Current.Web;

    tipoDocumentoSelezionato = lstLabelType.SelectedValue;
    this.renderizzaEtichetteFacoltative(tipoDocumentoSelezionato, table);

    string url = contextWeb.Url;
    string link = url + "/ARXEIA WEBPART/Stampa Etichetta.aspx?IsDlg=1&postazione=" + macchina + "&tipoDoc=" + tipoDocumentoSelezionato;
    SPUtility.Redirect(link, SPRedirectFlags.Default, Context);
};

如果您想保留单独的方法,可以采取以下方式:

Table table = new Table();

lstLabelType.SelectedIndexChanged += (o, e) => SelectDocumentTypeChanged(lstLabelType, table);


private void SelectDocumentTypeChanged(DropDownList lstLabelType, Table table)
{
    Debug.WriteLine("SelectDocumentTypeChanged() STARTED");

    SPWeb contextWeb = SPContext.Current.Web;

    tipoDocumentoSelezionato = lstLabelType.SelectedValue;
    this.renderizzaEtichetteFacoltative(tipoDocumentoSelezionato, table);

    string url = contextWeb.Url;
    string link = url + "/ARXEIA WEBPART/Stampa Etichetta.aspx?IsDlg=1&postazione=" + macchina + "&tipoDoc=" + tipoDocumentoSelezionato;
    SPUtility.Redirect(link, SPRedirectFlags.Default, Context);
}

我更喜欢将其作为一个单独的方法,这可行吗? - AndreaNobili
@AndreaNobili - 你为什么更喜欢那样做呢?这是很差的封装。 - Enigmativity
将此逻辑单独保留,并减少代码量到我的“主”类中。 - AndreaNobili
1
@AndreaNobili - 这真的取决于你的观点。我的方法将逻辑与事件代码放在一起,使重构更容易,并且它可以实现适当的封装。 - Enigmativity
不错的解决方案。但要注意它带来的一个问题(尽管我想不出更好的解决方案)。 - Hyarus
1
@Hyarus - 这是一个非常容易解决的问题。只需保留对处理程序的引用以供以后分离,或使用“System.Reactive.Disposables.Disposable.Create”(NuGet“System.Reactive”)来创建可用于清理处理程序的“IDisposable”- 您甚至不需要保留对原始处理程序的引用。 - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接