2011-11-07 21 views
0

我有一個非常動態的Web應用程序,它是在運行時動態創建的控件。多個動態創建的事件與處理程序! (ID問題)

這是我的代碼解決我的問題的第一個需要的部分。

這是在一個for循環,本質上它創建了多個複選框的ID和事件處理程序。

// All I am doing here is incrementing our session counter so we can increment our ID 
int id = Convert.ToInt32(Session["id"]); 
id++; 
Session["id"] = id; 

// Now I create my checkbox 
chkDynamic = new CheckBox(); 
chkDynamic.Text = "hey"; 
string chk = "chk" + id.ToString(); 

chkDynamic.ID = chk; 
chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged); 
Panel1.Controls.Add(chkDynamic); 

下一節是我們的習慣,甚至處理

protected void chkDynamic_CheckedChanged(object sender, EventArgs e) 
    { 

     if (((CheckBox)sender).Checked) 
      Response.Write("you checked the checkbox :" + this.chkDynamic.ID); 
     else 
      Response.Write("checkbox is not checked"); 
    } 

這令我奇怪的事情。是,這將完全正常工作,如果我改變:

string chk = "chk" + id.ToString(); 

要:

string chk = "chk"; 

但我們當然碰上「具有相同ID的多個控件」

我的問題是越來越這與獨特的ID一起工作!另外一些ODD信息可能會有所幫助。如果我將它從循環中取出,並手動添加具有不同ID的複選框,它也可以工作。這是令人震驚:(

chkDynamic = new CheckBox(); 
    chkDynamic.Text = "hey"; 
    // string chk = "chk" + id.ToString(); 

    chkDynamic.ID = "hey1"; 
    chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged); 
    Panel1.Controls.Add(chkDynamic); 

    chkDynamic = new CheckBox(); 
    chkDynamic.Text = "hey"; 
    // string chk = "chk" + id.ToString(); 

    chkDynamic.ID = "hey2"; 
    chkDynamic.CheckedChanged += new EventHandler(chkDynamic_CheckedChanged); 
    Panel1.Controls.Add(chkDynamic); 

我也調試我的程序,並存儲在Session [「ID」]的值不爲空,也沒有腐敗,始終保持0值呢!

謝謝。爲尋找傢伙/加爾斯我真的卡在這個

PS - !很抱歉,我們沒有任何錯誤事件只是不火,除非我硬編碼ID的

+0

你得到的錯誤是什麼?或者他們只是不渲染? – simonlchilds

+0

@csharpsi對不起。他們是沒有錯誤的。除非我硬編碼ID,否則事件不會啓動。 – clamchoda

+1

原因可能是因爲每個回發你都分配不同的ID - 控件必須重新分配相同的ID每次回發。 –

回答

0

也許你忘了重置sesssion(「ID」),所以當頁面回傳複選框時用新的ID重新創建。由於checkbox-es是在每次回發時重新創建的,因此每次都需要具有相同的ID,並且如果它們不被認爲是新控件,並且因此不會調用事件處理程序。

+0

嘿謝謝你的回覆,但他們肯定會得到重置,第一輪拋出調試會話ID = 0.第二輪會話ID = 1 。我也會在運行時得到一個aspx錯誤,指出多個唯一的ID,並且頁面不會呈現,但它確實是! – clamchoda

+2

不,你誤解了我,每次創建這些checkboxex時,它們都必須具有相同的ID。在我看來,你可以刪除會話[「ID」],並簡單地使用一個本地變量設置爲0在開始 – nogola

+0

啊,你完全正確。是否有重置該會話(「ID」) ? 每當回發發生時,局部變量都將被重置,除非它在!Page.IsPostBack中定義,但是其餘的應用程序沒有範圍到變量le :( – clamchoda

0

你有沒有嘗試設置AutoPostBack。您的複選框屬性爲true

+0

剛剛添加chkDynamoc.AutoPoastBack = true,但這並沒有解決我的問題:( – clamchoda

相關問題