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 );
...
8 svar · 638 visningar · startad av Travoni
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);
}
}
}
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 );
...
Ok, hur menar du?
Vad skiljer den kod som jag använder?
/T
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.
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
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);
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;
}
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.
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;
}