2009-09-18 17 views
1

我有一個asp:面板上的根和很多控件裏面。 當我禁用面板時,所有的孩子都是disbled(Panel.Enabled = false)。如何禁用ASP:面板但除了選擇性子控件?

但我想要其中的一些,例如超鏈接,即使容器被禁用也保持啓用狀態。

如果我不能以更聰明的方式做到這一點,我將不得不將我的面板分解成許多部分以使其工作。


編輯:

其實我在做什麼是頁面和形式的「UPDATE-ABLE」版的「只讀」版本。

回答

2

如果要禁用最需要的控件像

DisableAllChildControls(panel); // disabled all controls within panel 
//then enable those you want to keep enabled 
HyperlinkControl1InPanel.Enabled=true; 
HyperlinkControl2InPanel.Enabled=true; 
... 

void DisableAllChildControls(WebControl p) 
{ 
    foreach (WebControl c in p.Controls) 
    { 
     c.Enabled=false; 
     DisableAllChildControls(c); //recurse 
    } 
} 

,或者如果你只是想所有超鏈接啓用

void DisableAllControlsButHyperlinks(WebControl p) 
{ 
    foreach (WebControl c in p.Controls) 
    { 
     c.Enabled=(c is HyperLink); 
     DisableAllControlsButHyperlinks(c); //recurse 
    } 
} 
+0

當然,我以前做過,但這是一個爛攤子,因爲我所有的控制有不同的狀態,這是由另一個模塊控制。 我必須編程啓用/禁用所有這些,除了幾個按鈕。即我可以有一個「c.Enabled = A || B;」 A是從B抽象出來的?另外,A和B可以在任何事件中改變。 – 2009-09-18 16:21:36

+0

你可以傳遞'params control [] keepEnabled'參數,然後執行'foreach(webControl c in keepEnabled)c.Enabled = true;' – wefwfwefwe 2009-09-21 09:10:55

0

好吧,如果你不想打破面板,那麼你可以循環其子控件(如果沒有太多)。僞代碼:

foreach(var c in panel.controls) 
{ 
    if(c is not a hyperlink) c.Enabled=false; 
} 
1

很難理解什麼正是你想達到的。上面的答案對我來說似乎是完全合理的。我有這種感覺,你想保持啓用只是一些特定的控件,可能是一些特定的按鈕和一些特定的超鏈接。那是對的嗎??

爲什麼不考慮一些你不想禁用的控件(例如它們的id)的方法?你可以做到這一點通過聲明表示不應該在你的頁面/用戶控件被禁用像

string[] controlIdsToKeepEnabled = new string[]{"buttonSubmit", "hyperlinkInfo"} 

控件的ID的字符串列表則在該方法,你遞歸禁用所有網站的您檢查是否控制該控件不在列表「controlIdsToKeepEnabled」中。

有點複雜,但可以適用於您的特殊情況。這個功能可以很好地包裝在一個單獨的自定義服務器控件中。

2

嘗試了所有的決議,但它沒有工作剛剛開始使用的基礎知識和achived它,請參見下面的答案,可以幫助你

foreach (Control c in Panel1.Controls) 
{ 
    if (c is WebControl) 
    { 
     WebControl wc = (WebControl)c; 
     if (c.ID.Equals("ControlID")) 
     { 
      wc.Enabled = true; 
     } 
     else 
     { 
      wc.Enabled = false; 
     } 
    } 

} 

立即數控制?(喜歡的ContentPlaceHolder不能爲三夏被訪問)和控制啓用財產是可用於網絡和HTML控件只