2012-11-14 73 views
2

我創建了一堆複選框動態:ASP.NET:如何訪問動態創建的控制

CheckBox chkRead = new CheckBox(); 
chkRead.ID = "chk1"; 
chkRead.AutoPostBack = true; 
chkRead.CheckedChanged += new EventHandler(CheckBox_CheckedChanged); 

CheckBox chkPost = new CheckBox(); 
chkRead.ID = "chk2"; 
chkPost.AutoPostBack = true; 
chkPost.CheckedChanged += new EventHandler(CheckBox_CheckedChanged); 


protected void CheckBox_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox chk = (CheckBox)sender; 


} 

我想要做的是以下幾點: 當我檢查chkPost我的CheckBox希望chkRead複選框進行檢查以及

CheckBox_CheckedChanged事件我只能訪問到被點擊 的複選框,但我不知道該怎麼檢查該事件中的其他複選框。

+0

你試過'control.FindControl(「chk1」);'?如果您在回發中重新創建動態複選框,您應該可以訪問它... –

+0

@Robert Koritnik是的,我試過,但它返回null。我應該提到複選框位於Div控件中,而該控件又位於另一個ul/li元素中。 –

+1

ASP.NET FindControl不是遞歸的。您需要深入研究這一點,或者在chkRead添加到的容器上調用FindControl。 – Igor

回答

3

這是從內存,但你可以做這樣的事情:

protected void CheckBox_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox chk = (CheckBox)sender; 
    CheckBox chkPost = (CheckBox) chk.NamingContainer.FindControl("chk2"); 
    CheckBox chkRead = (CheckBox) chk.NamingContainer.FindControl("chk1"); 
    if(chk == chkPost && chk.Checked) 
    { 
     chkRead.Checked = true; 
    } 
} 

這是假設你想要做的這一切都在後臺代碼,回發後。如果你想用javascript來做,那是一個不同的問題。

這也假定chk1chk2是在同一個命名容器中。如果不是,事情會變得複雜。

+0

'chkRead'可能是本地方法變量,而不是全局頁面變量/屬性...因此,這個問題。我希望OP知道這一點。 –

+1

@RobertKoritnik是;我只是糾正它。 –

+1

@RobertKoritnik事實上,你給了我一個主意。再次編輯。 –

2

由於它是創建複選框的代碼,因此可以將它們的引用存儲在列表或字典中,並在需要時通過id檢索它們。

+1

我想你應該提到字典可以是頁面級本地內存變量,所以人們不會把它放在會話或任何其他有對象的緩存中...... :)然後,這個字典將填充每個頁面請求創建動態控件時。很好很簡單。比控制樹遍歷更好(也更快)。 +1 –

0

如果要動態做到這一點,你可以將屬性添加到你有興趣in--你checkboxess可以再循環在Page.Controls收集和測試您遍歷控制具有屬性,然後你可以檢查,或取消選中它。

一些僞代碼:

foreach(var control in Page.Controls) 
    if(typeof(Control) is CheckBox and ((CheckBox)control).Attributes["myAttr"] != null) 
    //check or uncheck it 

在閱讀您的評論關於嵌套controls--這可能是一個有點hassle--我傾向於伊戈爾同意的,你應該把ID的集合中因爲它們是動態添加的。

+1

ID也是一個屬性。爲什麼我們需要更多? –

0

您可以將代碼粘貼到創建這些複選框的位置嗎?它是「OnInit」還是其他地方?你是否將這些複選框放在容器中,將這些控件存儲爲全局變量還是在方法中創建它們?