Avatar billede beef12 Nybegynder
14. august 2006 - 22:45 Der er 12 kommentarer og
1 løsning

Liste alle Controls fra min side

Jeg har en dynamisk form, hvilket gør at jeg ikke ved hvor mange textbox's, dropdownmenuer osv. siden indeholder når formen submitte's. Jeg vil derfor gerne iterere igennem alle mine Controls ved hjælp af en foreach-sætning.

Men hvordan kan jeg finde frem til alle mine Controls, på en generisk måde?
Avatar billede beef12 Nybegynder
14. august 2006 - 23:42 #1
Fandt det her på MS' hjemmeside, men det virker desværre ikke - der kommer ikke noget frem...

string allTextBoxValues = "";
  foreach (Control c in Page.Controls)
  {
      foreach (Control childc in c.Controls)
      {
        if (childc is TextBox)
        {   
            allTextBoxValues += ((TextBox)childc).Text + ",";
        }
      }
  }
  if(allTextBoxValues != "")
  {
      Label1.Text = allTextBoxValues;
  }
Avatar billede snepnet Nybegynder
15. august 2006 - 00:16 #2
Du kan bruge denne her måske:

public class RecursiveTraveler
{
    private StringBuilder m_Log = new StringBuilder();
    private string m_Format = "{0}{1} : {2}<br />";
    private char m_PaddingChar = '+';

    public char PaddingChar
    {
        get { return m_PaddingChar; }
        set { m_PaddingChar = value; }
    }

    public string Format
    {
        get { return m_Format; }
        set { m_Format = value; }
    }
   
    public string Log
    {
        get { return m_Log.ToString(); }
    }
   
    public void Travel(Control root)
    {
        Travel(root, 0);
    }

    protected void Travel(Control control, int level)
    {
        m_Log.Append(CreateMessage(control, level));

        foreach (Control subControl in control.Controls)
        {
            if (subControl.HasControls())
            {
                Travel(subControl, level++);
            }
            else
            {
                m_Log.Append(CreateMessage(subControl, level));
            }
        }
    }

    protected virtual string CreateMessage(Control control, int level)
    {
        string indent = m_PaddingChar.ToString().PadLeft(level * 2, m_PaddingChar);
        return String.Format(m_Format, indent, control.UniqueID, control);
    }
}

Så kan du bare kalde den når du vil - prøv f.eks. i page_load:

RecursiveTraveler rec = new RecursiveTraveler();
rec.Travel(this);
Response.Write(rec.Log);

Mvh
Avatar billede snepnet Nybegynder
15. august 2006 - 00:19 #3
Men hvis det bare er fordi du gerne vil se det, kan du lave sådan en her i din web.config (under system.web):
<trace enabled="true" pageOutput="true"/> (gælder for alle sider)
Eller
Trace="true" i dit pagedirective (gælder så kun for den side).
Så får du en meget fin udskrift af hvad der er på din side (mm).
Mvh
Avatar billede beef12 Nybegynder
15. august 2006 - 21:22 #4
Hej snepnet. Tjo - principielt set gør det det rigtige - men jeg er egentlig kun interesseret i at få fat på control'ernes Navn (ID) og indtastet (Text).
Avatar billede snepnet Nybegynder
15. august 2006 - 21:32 #5
Det er jo bare metoden CreateMessage der laver teksten der gemmes for hver kontrol, så den kan du jo bare tilpasse lidt.
Jeg forstår ikke det med at du vil have teksten - du skrev at du ville have listet alle mulige kontroller.... Så det er vel afhængigt af kontroltype hvad du vil have ud i beskeden eller?
Mvh
Avatar billede beef12 Nybegynder
15. august 2006 - 22:48 #6
Jeps - ligesom i kodeeksemplet jeg postede. Jeg vil egentlig først og fremmest hente alle værdier fra min TextBox's, men idet jeg autogenerer mine TextBox's (jvf. mit spm: http://www.eksperten.dk/spm/724337 som du hjalp mig med), ved jeg aldrig hvor mange jeg har. Jeg har også dropdown-menuer, men det er ligemeget. Hvis jeg bare lærer hvordan jeg piller ID's og Text's ud af TextBox's, finder jeg nok også ud af hvordan jeg gør det ved de andre Control's.

Giver det bedre mening nu?
Avatar billede snepnet Nybegynder
15. august 2006 - 23:09 #7
Både og ... eksemplet piller jo id'et ud allerede :o), så jeg er ikke helt med på hvad du er i tvivl om der.
Mht. til det med at få teksten ud, så forholder det sig så heldigt, at det er baseret på et simpelt interface - hvilket medfører at du kan gøre sådan her, i GetMessage hvor du har kontrollen som parameter:

ITextControl iText = control as ITextControl;
if(iText != null)
{
  string text = iText.Text;
}

Det skulle gerne give dig teksten, såfremt control er én af følgende kontroller:
Avatar billede snepnet Nybegynder
15. august 2006 - 23:12 #8
Hov.... lidt for hurtigt knaptryk der :o)

LiteralControl
DataBoundLiteralControl
Label
ListControl
Literal
TextBox
BulletedList
CheckBoxList
DropDownList
ListBox
RadioButtonList

Kan være der et par stykker til...

Mvh
Avatar billede beef12 Nybegynder
15. august 2006 - 23:25 #9
Nå ja - du har ret. ID'et bliver jo spyttet ud.

Du skriver at jeg i GetMassage skal indsætte koden? Mener du CreateMessage?
Avatar billede snepnet Nybegynder
15. august 2006 - 23:28 #10
Jeps - klart... Sorry.
Jeg ved ikke om du lige skal indsætte koden som den er - det kommer lidt an på hvordan du vil have det ud jo.... Men du kan i hvert fald få fat i teksten sådan.
Mvh
Avatar billede beef12 Nybegynder
15. august 2006 - 23:40 #11
Jepper - lavede følgende nummer:

    protected virtual string CreateMessage(Control control, int level)
    {
        string text = "";
        ITextControl iText = control as ITextControl;
        if (iText != null)
        {
            text = iText.Text;
        }
        string indent = m_PaddingChar.ToString().PadLeft(level * 2, m_PaddingChar);
        return String.Format(m_Format, indent, control.ID, text, control);
    }

Og det spiller bare. Smid et svar så du kan få dine velfortjente points :-)
Avatar billede snepnet Nybegynder
15. august 2006 - 23:48 #12
Den er fjong :o)
Du kan benytte
string text = String.Empty istedet for = ""
Mvh
Avatar billede beef12 Nybegynder
15. august 2006 - 23:54 #13
Jep - jeg var bare lige doven der :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester