如何将输入参数正确地传递给C#中的事件处理程序方法?

如何将输入参数正确地传递给C#中的事件处理程序方法?,c#,asp.net,.net,C#,Asp.net,.net,我在C#和.NET方面是个新手,我有以下问题 在我的代码中,我有如下内容: Table table = new Table(); lstLabelType.SelectedIndexChanged += new System.EventHandler(SelectDocumentTypeChanged); Table table = new Table(); lstLabelType.SelectedIndexChanged += (sender, e) => { Debug

我在C#.NET方面是个新手,我有以下问题

在我的代码中,我有如下内容:

Table table = new Table();

lstLabelType.SelectedIndexChanged += new System.EventHandler(SelectDocumentTypeChanged);
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);
};
将事件处理程序附加到视图中的下拉元素

因此,当用户将所选值更改为该下拉列表时,将执行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对象传递给这个事件处理程序方法,因为我必须使用它


如何正确实施此行为?当用户更改我的下拉列表中的值时自动调用该表对象时,如何将该表对象传递给SelectDocumentTypeChanged()方法?

请尝试这样编写代码:

Table table = new Table();

lstLabelType.SelectedIndexChanged += new System.EventHandler(SelectDocumentTypeChanged);
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);
};
现在,您只需在事件处理程序中直接使用


您甚至可以现在忽略
发件人
,并执行以下操作:

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

SelectDocumentTypeChanged和table是同一个类的一部分吗?我更喜欢将其作为一个单独的方法保存,可能吗?@AndreaNobili-为什么您更喜欢这样做?它的封装性很差。为了保持这个逻辑的独立性并且在我的“main”中有更少的代码class@AndreaNobili-这取决于你的观点。我的方法将逻辑与事件代码保持在一起,使重构更容易,并实现适当的封装。@Hyarus-这是一个非常容易解决的问题。只需保留对处理程序的引用以便稍后分离,或者使用
System.Reactive.Disposables.Disposable.Create
(NuGet
System.Reactive
)来创建一个
IDisposable
,您可以使用它来清理处理程序-您甚至不需要保留对原始处理程序的引用。