Laden...

UserControl Array

Erstellt von Cindy vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.845 Views
C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren
UserControl Array

Hallo,

ich habe da ein Problem mit einem UserControl mit Checkboxen. Ich habe mir ein UserControl gebastelt, da ich dies aus der Windows-Programmierung mit C# kenne. Ich dachte hier wird das so ähnlich gehen, aber leider bin ich kurz vor dem Verzweifeln. Inzwischen kann ich auf mein UserControl zugreifen, ich weiß nur leider nicht wie ich mir daraus ein Array baue. Könnt ihr mir dabei helfen?

Grüße,Cindy

Gelöschter Account
vor 16 Jahren

tut mir leid aber ich erkenne die problemstellung nicht. im allgemeinen verwirren mich deine aussagen ziemlich.

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

ASP.NET != WindowsForms, da gibts riesen Unterschiede.
Was willst du tun?
Was für ein Array?
Wozu?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Also, es geht darum, dass ich dynamisch eine bestimmte Anzahl an Checkboxen mit dazugehörigem Label anzeigen und auswerten möchte. Der Inhalt und die Anzahl der Datensätze werden mittels diverser Abfragen aus der Datenbank ermittelt. Mit einem Datagrid wäre das sicherlich viel einfacher, aber darauf möchte ich verzichten, denn es soll möglichst wie oben beschrieben aussehen und nicht in Tabellenform. Um das ganze in die entsprechende Form zu bringen, habe ich mir ein UserControl erstellt. Nun möchte ich auf dieses UserControl zugreifen. Aufgrund der vorher nicht bekannten Anzahl an Datensätzen wollte ich ein dynamisch erstelltes Array nutzen. Mein Problem ist allerdings, dass ich nicht weiß wie ich dies mit ASP.NET und C# anstellen soll.

Ich hoffe mein Problem ist nun etwas klarer formuliert und ihr könnt mir helfen.

Grüße,Cindy

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Ja, jetzt ists schon viel klarer.
Controls erstellen, ID setzen!, mit Daten befüllen und zur Collection hinzufügen.
Du kannst das zuerst auch in eine Liste (List<Control>, ControlCollection) abfüllen.

Es ist wichtig, das du beim nächsten Laden der Seite jeweils wieder die benötigten Controls mit den gleichen! IDs erstellst, ansonsten werden diese nicht mehr gefunden und die Daten sind verloren.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich habe meine Lösung bisher so erstellt. Es werden hier also dynamisch nen paar Checkboxen erstellt. Ich stelle mir das nun so vor, dass der User jetzt bei den angezeigten Checkboxen eine Auswahl treffen kann. Diese soll nun mit einem Klick auf einen Button quasi gespeichert werden. Ich weiß nur leider nicht, wie ich nun herausfinden soll, welche von meinen Checkboxen angeklickt worden sind. Ich habe ihnen zwar eine ID gegeben, aber wie spreche ich die Checkboxen nun an?? Ich hoffe ihr könnt mir helfen.

Grüße,Cindy



int i=0;
while(myReader.Read())
{
TableRow tr = new TableRow();
TableCell td1 = new TableCell();
CheckBox chkbox = new CheckBox();
chkbox.ID = "chk" + i.ToString();
td1.Controls.Add(chkbox);

TableCell td2 = new TableCell();
Label lbl = new Label();
lbl.ID = "lbl" + i.ToString();
lbl.Text = nn + "," + vorname;
td2.Controls.Add(lbl)
tr.Cells.Add(td1);
tr.Cells.Add(td2);
tblDynamic.Rows.Add(tr);
i++;
}

5.941 Beiträge seit 2005
vor 16 Jahren

Salute Cindy

Anzahl (i) bspw. in einem HiddenField speichern, dann kannst du die Hierarchie wiederherstellen und schlussendlich auf die Daten zugreifen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich bins wieder. Ich verstehe deine Antwort in sofern, dass ich das quasi nochmal wiederherstellen muss. Ich habe auch die Tabellenstruktur wiederhergestellt, aber ich weiß nicht, wie ich nun an die Checkboxen rankommen soll. Ich weiß einfach nicht weiter. Ich bin total am verzweifeln, beschäftige mich nun schon 2 Tage damit.

Mein Code sieht dann so aus:


protected void Button1_Click(object sender, EventArgs e)
{
     int anz = tblDynamic.Controls.Count;
     for (int i = 0; i < anz; i++)
     {
         TableRow tr = new TableRow();
         TableCell td1 = new TableCell();
         TableCell td2 = new TableCell();
         tr = tblDynamic.Rows[i];
         td1 = tr.Cells[0];
         td2 = tr.Cells[1];
     }
}

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Control Hierarchie wiederherstellen (spätestens bis zum Event Page_Load),
und dann auf die Controls, die du eben erstellst hast, zugreifen.
So kommst du an die Werte.

Aber Button_Click ist zu spät, da sind die Post Daten schon im Nirvana.

Dynamische Controls sind nicht so einfach zu verstehen und dementsprechend auch nicht in einem Satz zu erklären.

Ich empfehle dir dazu Literatur in Form von Büchern oder Online Artikeln.
Online Quellen dazu gibts leider praktisch nur auf Englisch was taugliches.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Nochmal Hallöchen,

mmh, kannst du mir denn eine andere Lösung für mein Problem empfehlen? Ich denke du hast im Moment mein Problem verstanden. Ich stehe nur mächtig unter Zeitdruck und mir fehlt definitiv die Zeit mich da einzulesen. Mir fehlt im Grunde auch ein ähnliches Beispiel, um das alles irgendwie hinzukriegen. Es soll im Grunde so aussehen (siehe Bild)

Gibt es eine andere Möglichkeit als die, die wir bisher in Betracht gezogen haben?

Grüße

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Repeater + ItemTemplate + nach dem Postback alle Items durchgehen und per e.Item.FindControl() die Werte wieder auslesen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Ich verstehe leider immer noch nix von der Control-Hierarchie. Mir ist anscheinend nicht zu helfen. Kann mir irgendjemand für doofe erklären, was ich nun tun soll, damit ich auf meine Checkboxen zugreifen kann. Es tut mir wirklich Leid, aber ich hab wirklich keinen Schimmer. Warum ist button_click zu spät? aber wenn ich auf den Button drücke, dann soll er das doch machen und mir sagen, welche Checkboxen ausgewählt worden sind.

Grüße

5.941 Beiträge seit 2005
vor 16 Jahren

Salute Cindy

Button_Click wird im Seitezyklus nach Page_Load aufgerufen, darum ist es zu spät.
Aber da braucht es noch mehr Infos zu. Bei meiner Alternativlösung brauchst du das alles nicht zu wissen.

  1. Repeater auf die Seite ziehen
  2. ItemTemplate definieren, Controls reinpacken (CheckBox), ID vergeben
  3. Nach dem Postback alle RepeaterItems <Repeater>.Items durchgehen und auswerten
  4. Fertig

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

So, ich habe jetzt Schritt 1 und 2 hinter mir, hänge aber wieder bei Schritt 3. Wie gehe ich die RepeaterItems durch? ich habe bisher auch nix brauchbares gefunden, was mir dabei hilft. Hoffe du kannst mir nochmal helfen, dann hat es sich vielleicht endlich erledigt hier.

Grüße

5.941 Beiträge seit 2005
vor 16 Jahren

Salute Cindy

foreach(RepeaterItem item in <Repeater>.Items......
item.FindControl(<NameDesControlsImTemplate>)

Dieses Control casten (bspw. zu CheckBox) und auslesen, fertig.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hallo,
ich habe mich jetzt an dem Repeater versucht. Aber Leider will es nicht klappen. Wo liegt der Fehler? Ich habe das ganze hier mal in abgespeckter Version probiert, aber nicht das gewünschte Ergebnis erhalten.
Ich hoffe ihr könnt mir weiterhelfen.

Grüße


protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 10; i++)
        {
            CheckBox chkBoxen=new CheckBox();
            chkBoxen.ID = "testing" + i.ToString();
            chkBoxen.Text = "Checkbox " + i.ToString();
            Label lbls = new Label();
            lbls.ID = "lbl" + i.ToString();
            lbls.Text = "Label " + i.ToString();
            Repeater1.Controls.Add(chkBoxen);
            Repeater1.Controls.Add(lbls);
        
        }
        if (IsPostBack)
        {
            foreach (RepeaterItem dummy in Repeater1.Items)
            {
                dummy.FindControl("chkBox");
                CheckBox neu = new CheckBox();
                neu = (CheckBox)dummy.FindControl("chkBox");
            }
        }

    }
5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Was genau klappt nicht?
Das Initialisieren sollte in Page_Init rein.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

I
256 Beiträge seit 2005
vor 16 Jahren

@Cindy

Da guck ich immer nach http://www.asp.net/learn/

Und ich glaub Dir fehlen noch etwas die basic Grundlagen

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Guten Morgen, ich bin es mal wieder. sehe ich das richtig, dass ich das, was vorher im Page_Load() stand in Page_Init() schreiben muss?
Als ich das gemachthabe, konnte ich zumindest meine Checkboxen sehen. Klicke ich nun auf den Button passiert nix. Ich habe dann mal ein bisschen (im Debug-Modus) geschaut und herausgefunden, dass er quasi keine Items findet (Repeater1.Items.Count=0) . Ist die Zuweisung der Items (controls) vielleicht falsch?

Grüße

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Das Initialisieren sollte in Page_Init rein.

Also der erste Teil, bei dem du initialisierst.
Alles in if(IsPostBack) soll im Page_Load bleiben.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Das hatte ich eben auch schon einmal ausprobiert. Die foreach-Schleife wird jedoch nicht durchlaufen, da anscheinend keine Repeater1.Items vorhanden sind. Deswegen ja meine Frage von eben, ob die Zuweisung falsch ist.


protected void Page_Init(object sender, EventArgs e)
{
     for (int i = 0; i < 10; i++)
     {
       CheckBox chkBoxen = new CheckBox();
       chkBoxen.ID = "testing" + i.ToString();
       chkBoxen.Text = "Checkbox " + i.ToString();
       Label lbls = new Label();
       lbls.ID = "lbl" + i.ToString();
       lbls.Text = "Label " + i.ToString();
       Repeater1.Controls.Add(chkBoxen);
       Repeater1.Controls.Add(lbls);
     }
}

protected void Page_Load(object sender, EventArgs e)
{    
     if (IsPostBack)
     {
       foreach (RepeaterItem dummy in Repeater1.Items)
        {  
           dummy.FindControl("chkBox";
           CheckBox neu = new CheckBox();
           neu = (CheckBodummy.FindControl("chkBox";
        }
     }    
}

protected void Button1_Click(object sender, EventArgs e)
{
      Response.Redirect("Default2.aspx?" + adresse);
}

5.941 Beiträge seit 2005
vor 16 Jahren

Salute Cindy

So genau hab ich den Code nicht angeschaut.
Das initialisieren ist natürlich komplett falsch.

Erstelle RepeaterItems!
Füge zum Repeater Items jeweils deine Controls hinzu: item.Controls.Add(<CheckBox>)....

Füge die Items zur .Items Collection hinzu.
Und füge dein Repeater zu deiner Page hinzu.
Bspw.

this.form1.Controls.Add(repeater...
this.PlaceHolder.Controls.Add

Siehe dazu Stichwort: PlaceHolder

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

5.941 Beiträge seit 2005
vor 16 Jahren

Salute Cindy

Sorry, ich habe mich da geirrt.

1.
Du setzt den Repeater in den ASPX Code oder erstellst ihn per Code.
Weisst ihm ein Item Template zu und machst ein DataBinding.

So kannst du über <Repeater>.Items gehen.

2.
Items manuell zu erstellen klappt zwar auch, aber ist kein normal gangbarer Weg.
Der Repeater ist fürs Databinding gedacht.

Im Prinzip würdest du den Repeater so nur als Container benutzen, und könntest genauso (ohne Item und SeperatorTemplate) ein Panel dafür nehmen und nur auf der Controls Collection rumspringen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

mmh, ich verstehe nicht ganz, was du meinst. also ich denke ich habe das soweit...also mit den databind() und so. bin ich jetzt immer noch komplett auf dem holzweg? wie gesagt, das Problem liegt nun irgendwie darin, dass er nach dem Button_Click() die Methode Page_Init() erneut aufruft. So sind alle Änderungen (gecheckten Checkboxen) wieder verloren und ich komme da nicht ran.


private void Page_Init(object sender, EventArgs e)
{
        ArrayList myDataSource = new ArrayList();
        for (int i = 0; i < 10; i++)
        {  
              CheckBox chkBoxen = new CheckBox();
              chkBoxen.ID = "testing" + i.ToString();
              chkBoxen.Text = "Checkbox " + i.ToString();
              Label lbls = new Label();
              lbls.ID = "lbl" + i.ToString();
              lbls.Text = "Label " + i.ToString();
              myDataSource.Add(chkBoxen);
         }
       RepeaterItemCollection collect = new RepeaterItemCollection(myDataSource);
       Repeater1.DataSource = collect;
       Repeater1.DataBind();
       this.PlaceHolder1.Controls.Add(Repeater1);
}

protected void Page_Load(object sender, EventArgs e)
{

       PlaceHolder1.FindControl("rep1";
       if (Page.IsPostBack)
       {
               foreach (RepeaterItem dummy in Repeater1.Items)
               {
                    dummy.FindControl("chkBox";
                    CheckBox neu = new CheckBox();
                    neu = (CheckBodummy.FindControl("chkBox";
               }
        }
}

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Vergiss alles was du schon hast und alles was ich geschrieben habe (Von ohne (UserControl Array)).
Und mach dann die Möglichkeit 1.

Was verstehst du daran nicht?

Genau dasselbe ist übrigens hier (UserControl Array) noch ein wenig detailierter beschrieben.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

C
Cindy Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

So, also ich habe jetzt einige Zeit gegrübelt und ich verstehe deine Antwort in sofern nicht, dass sie sich für mich anhört, als solle ich das gleiche, was ich schon habe, noch einmal machen. Allerdings sagtest du ja, ich solle alles vergessen bis auf dein vorletztes posting....von wegen schritt 1 machen. nur schritt 1 hört sich für mich so an, als wäre es dasselbe, wie das was ich schon gemacht habe. Das würde doch dann so aussehen wie in meiner for-schleife bzw. in meinem page_init(), denn ha habe ich auch ein item template zugewiesen und ein databind gemacht.
Ich bin kurz vor der Aufgabe, aber irgendwie muss das doch zu machen sein.

Grüße,Cindy

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Cindy

Sorry das ich dich verwirrt habe, das war nicht meine Absicht.

Hier eine Schritt für Schritt Anleitung, aber mehr kann ich dir echt nicht bieten:

  1. Repeater erstellen (ASX oder per Code)

  2. ItemTemplate erstellen (enthält deine CheckBox), (ASPX oder Code)

  3. Databinding Expressions für deine CheckBox erstellen (Welches Datenfeld soll .Checked repräsentieren, welches .Text)

  4. Daten binden (Richtige Daten, keine Controls oä.)

  5. per foreach(RepeaterItem item... item.FindControl(<NamederCheckBox)... auslesen

  6. Fertig

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

N
22 Beiträge seit 2008
vor 16 Jahren

Hallo Cindy,

ich bin auch ASP.NET Anfänger aber erfahrender Windows -Entwickler.

Mich hat deine Problemstellung interessiert und habe mich gleich mal an ein Beispiel
gesetzt. Du kannst die CheckBox-Collection direkt der Controls-Eigenschaft zuweisen
und im PostBack wieder auslesen. Da die CheckBox-Collection im Init erzeugt wird, werden die geposteten Daten auch behalten.


public partial class WebUserControl : System.Web.UI.UserControl
{
    public WebUserControl()
    {
        Init += new EventHandler(WebUserControl_Init);
    }

    void WebUserControl_Init(object sender, EventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            CheckBox checkBox = new CheckBox();
            checkBox.ID = "CheckBox" + i.ToString();
            checkBox.Text = checkBox.ID;
            checkBox.Width = new Unit(100);
            Controls.Add(checkBox);
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            int i = 0;
            foreach (Control item in Controls)
            {
                CheckBox checkBox = item as CheckBox;
                if (checkBox != null)
                {
                    if (checkBox.Checked)
                    {
                        i++;
                    }
                }
            }
            this.CountLabel.Text = i.ToString();
        }
    }
}

N
22 Beiträge seit 2008
vor 16 Jahren

Anbei ein Beispiel mit einem DataSource und einer CheckBoxList mit DataBinding.

DataItem-Klasse:


public class CheckBoxItem
{
    private string _name = "";
    private bool _checked = false;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }

    public bool Checked
    {
        get
        {
            return _checked;
        }
        set
        {
            _checked = value;
        }
    }
    public CheckBoxItem(string name, bool value)
	{
        _name = name;
        _checked = value;
	}
}

DataSource-Klasse:


public class CheckBoxList : System.Collections.Generic.List<CheckBoxItem>
{
	public CheckBoxList()
	{
        for (int i = 0; i < 100; i++)
        {
            Add(new CheckBoxItem("CheckBox" + i.ToString(), false));
        }
	}
}

ASP-UserControl:


<asp:CheckBoxList ID="CheckBoxList1" runat="server" 
    DataSourceID="ObjectDataSource1" DataTextField="Name" DataValueField="Checked">
</asp:CheckBoxList>

<asp:thumbsup:bjectDataSource ID="ObjectDataSource1" runat="server" 
    SelectMethod="ToArray" TypeName="CheckBoxList"></asp:thumbsup:bjectDataSource>

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo Nuramir

Die Vorgehensweise die ich als letztes genannt habe, ist die normale und empfohlene.
Bei deinen Beispielen sehe ich nicht viel Sinn.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

N
22 Beiträge seit 2008
vor 16 Jahren

Wieso?

Mein zweites Beispiel ist doch genau das was du oben geschrieben hast. Ich habe als DataSource halt zur Demo eine simple Collection gewählt. Anstatt ein Repeater habe ich die CheckBoxList verwendet. Im Endeffekt ist das doch genau das selbe.

Mein erstes Beispiel zielte auf die Aufgabenstellung direkt ab, da ging es darum dynamisch CheckBox-Controls zu erzeugen und wieder auszuwerten. Das Beispiel funktioniert einwandfrei, also auch nichts falsches.

Trotzdem würde ich dafür fertige Controls mit Datenbindung empfehlen.

5.941 Beiträge seit 2005
vor 16 Jahren

Hallo zusammen

@Nuramir
Jup, deine Beispiele gehen schon, allerdings ist das nichts konventionelles.

Normalerweise würde man dazu einfach eine CheckBoxList nehmen.
Diese rendert aber im Normalfall Tabellen.

Wenn man dies nicht möchte kann der Wert über einen Repeater + Templates + Databinding gewählt werden.

Falls der Checked Status auch gebunden werden soll, könnte sowas hier passen:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011