第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Asp.net:如何添加引用動(dòng)態(tài)創(chuàng)建元素的事件處理程序

Asp.net:如何添加引用動(dòng)態(tài)創(chuàng)建元素的事件處理程序

C#
慕工程0101907 2021-06-30 21:10:02
我有一個(gè) asp.net 程序,可以創(chuàng)建一個(gè)簡(jiǎn)單的調(diào)查表供用戶回答。大多數(shù)問題使用一個(gè)下拉列表,其答案分?jǐn)?shù)為 1-5(壞-好),我正在嘗試向下拉列表對(duì)象添加一個(gè)事件處理程序,以便僅在用戶選擇 1 到 1 之間的分?jǐn)?shù)時(shí)才啟用評(píng)論框2.然而,當(dāng)我為事件處理程序添加委托 lambda 調(diào)用時(shí),而不是每個(gè)下拉列表影響它們自己對(duì)應(yīng)的注釋框,它們似乎都只指向添加的最后一個(gè)(并且它們工作一次,然后沒有更多,只有最后一個(gè) ddl 繼續(xù)具有預(yù)期的行為)。我的代碼:   //Called from Page_Load   private void PopulateSurvey()   {        btnSubmit.Enabled = true;        List<Question> questions = (from p in context.Questions                                    join q in context.Survey_Questions on p.ID equals q.QuestionID                                    where q.SurveyID == surveyid                                    select p).ToList();        Table tbl = new Table();        tbl.Width = Unit.Percentage(100);        TableRow tr;        TableCell tc;        TableCell tc1;        TableCell tc2;        TextBox txt;        CheckBox cbk;        DropDownList ddl = new DropDownList();        foreach (Question q in questions)        {            if (q.Division.Equals("General") || q.Division.Equals(ddlDivisions.SelectedValue.ToString()))            {                tr = new TableRow();                tc = new TableCell();                tc.Width = Unit.Percentage(55);                tc.Text = q.Text;                tc.Attributes.Add("id", q.ID.ToString());                tr.Cells.Add(tc);                tc = new TableCell();                if (q.QuestionType.ToLower() == "singlelinetextbox")                {                    txt = new TextBox();                    txt.ID = "txt_" + q.ID;                    //txt.Width = Unit.Percentage(40);                    tc.Controls.Add(txt);                }首先想到的是,事件處理程序可能會(huì)保留引用本身,而不是每個(gè)問題創(chuàng)建的孤立對(duì)象,因此所有事件處理程序最終都具有相同的 tc1 和 tc2 引用,因此只有最后一個(gè)對(duì)象?是這樣嗎,如果是這樣,我該如何解決?
查看完整描述

1 回答

?
搖曳的薔薇

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊

你的問題在這一行:

ddl.SelectedIndexChanged +=
    (sender, e) => ScoreChanged(sender, e, tc1,tc2, ddl.SelectedIndex);

這里有兩件事很重要:

  • 您正在使用匿名方法調(diào)用ScoreChanged.

  • 您正在傳遞tc1tc2作為ScoreChanged方法的參數(shù)。您已在代碼塊的開頭、循環(huán)定義了這些變量。

在這種情況下,神奇的詞是閉包。由于tc1tc2是在匿名方法的范圍之外定義的,因此它們變成了閉包。這意味著在您定義方法時(shí)將沒有值,但在您調(diào)用它時(shí)。由于您不斷覆蓋foreach循環(huán)中變量的值,因此在調(diào)用時(shí)這些變量將具有循環(huán)最后一次迭代的值。

解決方案很簡(jiǎn)單:在循環(huán)內(nèi)聲明變量。這將為 的每次迭代創(chuàng)建一個(gè)新的閉包foreach

TableRow tr;

TableCell tc;

TextBox txt;

CheckBox cbk;


foreach (Question q in questions)

{

    TableCell tc1;

    TableCell tc2;

    DropDownList ddl; //Don't forget to include ddl, since you are using its selected index

    //...

更一般的注意事項(xiàng):不要在 C# 中的方法的開頭執(zhí)行這樣的“聲明”塊。第一次使用時(shí)聲明變量(除非有充分的理由不這樣做,例如您希望它成為閉包的一部分)。這有很多很好的理由,而您只是體驗(yàn)過其中的一個(gè)。另一種情況是,當(dāng)您將部分代碼轉(zhuǎn)換為具有 Visual Studio 重構(gòu)功能的方法時(shí),您會(huì)將預(yù)先聲明的變量作為ref參數(shù)傳遞。這些是最明顯的原因。還有更多。


查看完整回答
反對(duì) 回復(fù) 2021-07-03
  • 1 回答
  • 0 關(guān)注
  • 142 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)