webForumDet fria alternativet

Gömma kontroller?

.NET

8 svar · 638 visningar · startad av Travoni

Medlem sedan okt. 20041 556 inlägg
Frågan#1

Har en sub för att gömma kontroller på sidan (se kod), men om jag ex. gömma alla kontroller för utom en så funkar inte denna.
ex.

HideControls(this.Page.Controls);
_holder.Visible = True;

Antar att det är för att "moderkontrollerna" göms, men hur skall jag komma runt det?
Det enda jag fill skall finnas på sidan när jag gömt alla kontroller är ett javascript.

public static void HideControls(ControlCollection controls) 
{ 
    foreach (Control ctrl in controls) { 
        try { 
            ctrl.Visible = false; 
        } 
        catch (Exception ex) { 
            continue; 
        } 
        if (ctrl.HasControls()) { 
            HideControls(ctrl.Controls); 
        } 
    } 
}
Medlem sedan dec. 20003 887 inlägg
#2

Jag vet inte om det är som du säger, men det är ju ganska enkelt att rekursera dig ner till sista child-kontrollen innan du börjar gömma saker.

foreach ( Control ctrl in controls )
{
  if ( ctrl.HasControls() )
    HideControls( ctrl.Controls );
...
Medlem sedan okt. 20041 556 inlägg
#3

Ok, hur menar du?
Vad skiljer den kod som jag använder?
/T

Medlem sedan jan. 20012 204 inlägg
#4
public static void HideControls(ControlCollection controls) 
{ 
    foreach (Control ctrl in controls) { 
        try { 
            ctrl.Visible = false; 
        } 
        catch (Exception ex) { 
            continue; 
        } 
        if (ctrl.HasControls()) { 
            HideControls(ctrl.Controls); 
        } 
    } 
}

=>

public static void HideControls(ControlCollection controls) 
{ 
    foreach (Control ctrl in controls) { 
        if (ctrl.HasControls()) { 
            HideControls(ctrl.Controls); 
        } 

        try { 
            ctrl.Visible = false; 
        } 
        catch (Exception ex) { 
            continue; 
        } 

    } 
}

Då göms den som är längst ner i trädet först... om det nu verkligen spelar roll.

Medlem sedan okt. 20041 556 inlägg
#5

Får inte till det.
Om jag vill "släcka" alla kontroller - utom "ctl00$CPH2$Button1" (den sista röda)
Så måste jag väl lista igenom alla kontroller och gömma alla som inte är röda i detta fall. ...på någe vis?!

 [red][B]__Page ASP.default_aspx 13350 0 0 [/B] [/red] 
    [red][B]ctl00 ASP.masterpages_defaultmaster_master[/B][/red]
        ctl00$ctl05 System.Web.UI.LiteralControl
        ctl00$ctl00 System.Web.UI.HtmlControls.HtmlHead 
            ctl00$ctl02 System.Web.UI.HtmlControls.HtmlMeta 
            ctl00$ctl03 System.Web.UI.HtmlControls.HtmlTitle 
            ctl00$ctl04 System.Web.UI.HtmlControls.HtmlLink 
            ctl00$ctl06 System.Web.UI.LiteralControl
            ctl00$CPH3 System.Web.UI.WebControls.ContentPlaceHolder
        ctl00$ctl07 System.Web.UI.LiteralControl
        [red][B]aspnetForm System.Web.UI.HtmlControls.HtmlForm[/B][/red]
            ctl00$ctl01 System.Web.UI.ScriptManager
            ctl00$ctl08 System.Web.UI.LiteralControl
            ctl00$loginname1 System.Web.UI.WebControls.LoginName
            ctl00$ctl09 System.Web.UI.LiteralControl
            ctl00$loginstatus3 System.Web.UI.WebControls.LoginStatus
                ctl00$loginstatus3$ctl00 System.Web.UI.WebControls.LinkButton 
                ctl00$loginstatus3$ctl01 System.Web.UI.WebControls.ImageButton 
                ctl00$loginstatus3$ctl02 System.Web.UI.WebControls.LinkButton
                ctl00$loginstatus3$ctl03 System.Web.UI.WebControls.ImageButton 
            ctl00$ctl10 System.Web.UI.ResourceBasedLiteralControl
            ctl00$list InovArt.Controls.SimpleMenu
                ctl00$ctl11 System.Web.UI.LiteralControl
            ctl00$ctl12 System.Web.UI.LiteralControl
            ctl00$SubMenuPh System.Web.UI.WebControls.PlaceHolder 302 0 0 
                ctl00$ctl14 System.Web.UI.LiteralControl 302 0 0 
            ctl00$ctl15 System.Web.UI.ResourceBasedLiteralControl 272 0 0 
            ctl00$CPH1 System.Web.UI.WebControls.ContentPlaceHolder 1161 0 0 
                ctl00$CPH1$ctl00 System.Web.UI.LiteralControl 8 0 0 
                ctl00$CPH1$label1 System.Web.UI.WebControls.Label 36 0 0 
                ctl00$CPH1$ctl02 System.Web.UI.LiteralControl 6 0 0 
            ctl00$msg System.Web.UI.WebControls.Label 40 0 0 
            ctl00$ctl19 System.Web.UI.LiteralControl 170 0 0 
            [red][B]ctl00$CPH2 System.Web.UI.WebControls.ContentPlaceHolder 270 0 0[/B][/red] 
                ctl00$CPH2$ctl00 System.Web.UI.LiteralControl 6 0 0 
                [b][red]ctl00$CPH2$Button1 System.Web.UI.WebControls.Button[/red][/b] 262 0 0 
                ctl00$CPH2$ctl01 System.Web.UI.LiteralControl 2 0 0 
            ctl00$ctl20 System.Web.UI.LiteralControl 50 0 0 
            ctl00$Login1 System.Web.UI.WebControls.Login 0 0 0 
                ctl00$Login1$ctl00 System.Web.UI.WebControls.Login+LoginContainer 0 24 0 
                    ctl00$Login1$ctl01 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$UserName System.Web.UI.WebControls.TextBox 0 0 0 
                    ctl00$Login1$ctl02 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$UserNameRequired System.Web.UI.WebControls.RequiredFieldValidator 0 0 0 
                    ctl00$Login1$ctl03 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$Password System.Web.UI.WebControls.TextBox 0 0 0 
                    ctl00$Login1$ctl04 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$PasswordRequired System.Web.UI.WebControls.RequiredFieldValidator 0 0 0 
                    ctl00$Login1$ctl05 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$RememberMe System.Web.UI.WebControls.CheckBox 0 28 0 
                    ctl00$Login1$ctl06 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$Login System.Web.UI.WebControls.Button 0 0 0 
                    ctl00$Login1$ctl07 System.Web.UI.LiteralControl 0 0 0 
                    ctl00$Login1$FailureText System.Web.UI.WebControls.Literal 0 0 0 
                    ctl00$Login1$ctl08 System.Web.UI.LiteralControl 0 0 0 
            ctl00$ctl21 System.Web.UI.LiteralControl 184 0 0 
        ctl00$ctl22
Medlem sedan juni 20008 205 inlägg
#6

Freestylat, otestat, nästan pseudo-kod:

public static bool HideNonAncestors(Control control, Control descendant) 
{ 
    if (control == descendant)
    {
        control.Visible = true;
        return true;
    }
    bool wasAncestor = false;
    foreach (Control child in control.Controls)
    {
        if (wasAncestor) child.Visible = false;
        else if (HideNonAncestors(child, descendant)) wasAncestor = true;
    }
    control.Visible = wasAncestor;
    return wasAncestor;
} 

...

HideNonAncestors(Page, _holder);
Medlem sedan okt. 20041 556 inlägg
#7

Det blir fortfarande bara vitt, gör jag ngt fel?

private bool wasAncestor = false;

public static bool HideNonAncestors(Control ctrl, Control descendant) 
{ 
    if (object.ReferenceEquals(ctrl, descendant)) { 
        ctrl.Visible = true; 
        return true; 
    } 
    foreach (Control child in ctrl.Controls) { 
        if ((wasAncestor)) { 
            child.Visible = false; 
        } 
        else if ((HideNonAncestors(child, descendant))) { 
            wasAncestor = true; 
        } 
    } 
    return wasAncestor; 
}
Medlem sedan juni 20008 205 inlägg
#8

ctrl.Visible = wasAncestor har försvunnit. Sen gillar jag inte riktigt hur du gjort wasAncestor till en medlem, kan inte komma på varför det skulle paja något iofs men det behövs inte = låt bli. Annars rekommenderar jag en genomsteppning med debuggern, den är utmärkt.

Medlem sedan okt. 20041 556 inlägg
#9

Oki tack, denna funkar bra:

public static bool HideNonAncestors(Control ctrl, Control descendant) 
{ 
    if (object.ReferenceEquals(ctrl, descendant)) { 
        ctrl.Visible = true; 
        return true; 
    } 
    bool wasAncestor = false; 
    foreach (Control child in ctrl.Controls) { 
        try { 
            if ((wasAncestor)) { 
                child.Visible = false; 
            } 
            else if ((HideNonAncestors(child, descendant))) { 
                wasAncestor = true; 
            } 
        } 
        catch (Exception ex) { 
            continue; 
        } 
    } 
    ctrl.Visible = wasAncestor; 
    return wasAncestor; 
}
364 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
227 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
232 ms — ändringar (db)