Avatar billede kak Nybegynder
21. maj 2006 - 15:48 Der er 20 kommentarer og
1 løsning

Tilføje checkbox dynamisk til dynamisk tabel

Jeg opretter en tabel dynamisk og vil gerne tilføje en checkbox til en af cellerne i tabellen. Jeg skal bagefter kunne gennemgå hvilke checkboxe der er markeret, og laver derfor en checkboxlist.

Jeg gør sådan her...

        Dim cbL As New CheckBoxList
        cbL.ID = "cb"
        While rs.Read

            Dim trow As New TableRow

            Dim cb As New ListItem
            cb.Value = rs("id")
            cbL.Items.Add(cb)

            Dim tCell As New TableCell()
            tCell.Controls.Add(cbL)
            trow.Cells.Add(tCell)

............

Men det virker ikke helt som forventet. Alle checkbokse bliver placeret i den sidste række i tabellen (sikkert fordi jeg tilføjer cbL som jo er hele listen). Men jeg kan ikke gøre sådan her: tCell.Controls.Add(cb)
Så får jeg fejl på cb, da det ikke et et gyldigt element til dette formål.

Hvordan kan jeg sætte en chekcbox ind i hver række, og senere finde frem til dem der er markeret?
Avatar billede snepnet Nybegynder
21. maj 2006 - 16:47 #1
Hvis du vil have en ny checkboxliste for hver række, må du instantiere dig en ny for hver række.... I den kode du har instantierer du kun en enkelt checkboxlist.
Mvh
Avatar billede kak Nybegynder
21. maj 2006 - 17:10 #2
Det skal jo helst være den samme liste, men blot med x antal checkbokse. Ellers kan jeg vel ikke hente værdierne senere, når jeg ikke kender det præcise antal?
Avatar billede snepnet Nybegynder
21. maj 2006 - 17:24 #3
Du kan ikke sætte den samme list ind forskellige steder, men du kan sagtens løbe items under en given checkboxlist igennem, og finde status.

foreach(ListItem item in someCheckBoxList.Items)
{
  if(item.Selected)
  {
    // ... gør noget her hvis der er valgt.
  }
}

Mvh
Avatar billede kak Nybegynder
21. maj 2006 - 17:29 #4
Jeg tror ikke, jeg har fået forklaret det rigtigt, eller også misforstår jeg din løsning.

Jeg har brug for én checkboxliste, med én checkbox for hver række i tabellen.  Der er et vilkårligt antal rækker i tabellen.
Avatar billede snepnet Nybegynder
22. maj 2006 - 00:33 #5
Oki.... så kan du bare sætte én ind pr. række:

        While rs.Read

            Dim trow As New TableRow

            Dim cb As New CheckBox
            cb.Value = rs("id")

            Dim tCell As New TableCell()
            tCell.Controls.Add(cb)
            trow.Cells.Add(tCell)

Du kan uden problemer finde dem igen når du vil ved at løbe tabellen igennem og pr. række finde din checkbxox.

Skal det være programmatisk? (ellers kan du bare lægge ind i din template a der skal vær en checkbox i rækken).

Mvh
Avatar billede kak Nybegynder
22. maj 2006 - 14:09 #6
Det lyder godt, og præcis det jeg skal bruge! Men jeg kan dog ikke sætte cb.value, da value åbenbart ikke er en egenskab for en checkbox. Så hvordan sætter jeg så værdien?

Kan du give et eksempel på, hvordan jeg ser hvilke der er markeret, hvis jeg vil bruge en sub til at gennemløbe alle rækkerne?
Avatar billede snepnet Nybegynder
22. maj 2006 - 14:26 #7
Hehe ... du kan bruge .Text på checkboxen til at angive værdien (hvis det er noget dine brugere skal se altså... Ellers kan du bare lade være med at angive noget.
Du kan godt få et eksempel - skal det være baseret på ren programmatisk opbygning, eller er det lige så fint hvis det er deklerativt?
Mvh
Avatar billede kak Nybegynder
22. maj 2006 - 14:40 #8
Nu var det ikke meningen, at der skulle stå en tekst ved siden af checkboxen, så det lyder fint at jeg kan undgå det.

Øhhh, deklerativt?! Jeg ved ikke præcis hvad du mener, men via en sub, skal jeg kunne gennemgå alle checkbokse, og se hvilke der er markeret (hvordan jeg så end kan gøre det, når jeg ikke kan angive et id eller en værdi for den?)
Avatar billede kak Nybegynder
22. maj 2006 - 14:43 #9
Jeg kan jo sætte .text og definere farven til hvid (som er min baggrundsfarve). Så har jeg jo en værdi med hver tekstboks!
Avatar billede snepnet Nybegynder
22. maj 2006 - 14:46 #10
Hvis du f.eks. benytter en af de indbyggede kontroller der kan generere lister udfra et datagrund (datalist, datagrid, gridview, repeater), så kan du skrive i din html, hvordan listen skal se ud... F.eks. at der skal indsættes en CheckBox et sted.

// her et datagrid indsat deklerativt
<form id="form1" runat="server">
  <asp:DataGrid id="grid" runat="server" />
</form>

// og her det samme - indsat imperativt (programmatisk)
DataGrid grid = new DataGrid();
form1.Controls.Add(grid);

Hvordan vil du helst have det?

Mvh
Avatar billede kak Nybegynder
22. maj 2006 - 14:49 #11
Så må det være programmatisk (dog med undtagelse af, at det gerne skulle være i en tabel :-)
Avatar billede snepnet Nybegynder
22. maj 2006 - 15:09 #12
Oki - du får en tabel her... Bare som eksempel:

protected Table m_Table = new Table();

protected void Page_Load(object sender, EventArgs e)
{
    // indsæt tabellen
    CreateAndInsertTable(new string[] { "A", "B", "C" });

    // indsæt en knap
    Button btn = new Button();
    btn.Text = "Save";
    btn.Click += new EventHandler(btn_Click);
    form1.Controls.Add(btn);
}

void btn_Click(object sender, EventArgs e)
{
    foreach (TableRow row in m_Table.Rows)
    {
        CheckBox cb = row.Cells[0].Controls[0] as CheckBox;
        // bare så der er lidt at se op også - det er ikke en anbefaling
        Response.Write(cb.Checked.ToString() + "<br />");
    }
}

protected void CreateAndInsertTable(string[] data)
{
    foreach (string s in data)
    {
        TableRow row = new TableRow();
        m_Table.Rows.Add(row);

        TableCell cell = new TableCell();
        row.Cells.Add(cell);

        CheckBox cb = new CheckBox();
        cb.Text = s;
        cell.Controls.Add(cb);
    }

    form1.Controls.Add(m_Table);
}

Mvh
Avatar billede kak Nybegynder
22. maj 2006 - 15:52 #13
Tak for det. Men jeg bruger vb, og kan som regel godt få konverteret fra C, med lidt afprøvning. Men denne gang, kan jeg ikke få det til at virke.

Jeg tilføjer rækkerne i tabellen sådan her...

        While rs.Read

            Dim trow As New TableRow

            Dim tCell1 As New TableCell()
            Dim cb As New CheckBox
            cb.Text = rs2("id")
            cb.ForeColor = Drawing.Color.White
            tCell1.Controls.Add(cb)
            trow.Cells.Add(tCell1)

............

Derefter prøvet jeg at gennmgå rækkerne, med denne her....

        Dim tabl As Table
        tabl = Table1
        Dim tbrw As TableRowCollection
        tbrw = tabl.Rows
        Dim rw As TableRow
        For Each rw In tbrw
            msgbox("test")
        Next

Men selvom der er rækker i tabellen, kommer der ikke en msgbox (hverken for hver række, eller bare en enkelt gang). Jeg har prøvet lidt af hvert, for at genngmgå alle rækkerne, så ovenstående er blot mit sidste forsøg.
Avatar billede snepnet Nybegynder
22. maj 2006 - 16:38 #14
Her opretter du jo en ny tabel:

        Dim tabl As Table
        tabl = Table1
        Dim tbrw As TableRowCollection
        tbrw = tabl.Rows
        Dim rw As TableRow
        For Each rw In tbrw
            msgbox("test")
        Next

Som du ikke putter noget ind i.

Du skal tage fat i den eksisterende tabel - så du skal lægge din Table-variabel op som klassevariabel, og løbe den igennem istedet.

Den jeg har angivet sådan her i C# eksemplet:
protected Table m_Table = new Table();

Mvh
Avatar billede kak Nybegynder
23. maj 2006 - 13:23 #15
Ok, jeg tror jeg er kommet noget videre. Nu opretter jeg m_Table først og putter derefter data i den, som du beskriver.

Men når jeg så skal hente værdierne fra den, får jeg en fejl, fordi den ikke kan finde m_table. Jeg gør sådan her:

        Dim mt As Table
        mt = form1.FindControl("m_Table")
        Dim tr As TableRow

        For Each tr In mt.Rows
            'Do something
        Next

Den fejler på denne linie: For Each tr In mt.Rows

Og fejlen er:
System.NullReferenceException: Object reference not set to an instance of an object.
Avatar billede snepnet Nybegynder
23. maj 2006 - 13:52 #16
Din m_Table er jo bare en klassevariabel, så du skal bare bruge den direkte:

        Dim tr As TableRow

        For Each tr In m_Table.Rows
            'Do something
        Next

Mvh
Avatar billede kak Nybegynder
23. maj 2006 - 13:58 #17
Så får jeg desværre at vide, at m_table ikke er deklæreret.
Avatar billede snepnet Nybegynder
23. maj 2006 - 14:04 #18
Så har du jo så ikke sat den op som en klassevariabel...
Mvh
Avatar billede snepnet Nybegynder
23. maj 2006 - 14:05 #19
Hvis du bruger denne her:
http://www.developerfusion.co.uk/utilities/convertcsharptovb.aspx

Får du det her ud:
Protected m_Table As Table = New Table

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
CreateAndInsertTable(New String() {"A", "B", "C"})
Dim btn As Button = New Button
btn.Text = "Save"
AddHandler btn.Click, AddressOf btn_Click
form1.Controls.Add(btn)
End Sub

Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs)
For Each row As TableRow In m_Table.Rows
  Dim cb As CheckBox = CType(ConversionHelpers.AsWorkaround(row.Cells(0).Controls(0), GetType(CheckBox)), CheckBox)
  Response.Write(cb.Checked.ToString + "<br />")
Next
End Sub

Protected Sub CreateAndInsertTable(ByVal data As String())
For Each s As String In data
  Dim row As TableRow = New TableRow
  m_Table.Rows.Add(row)
  Dim cell As TableCell = New TableCell
  row.Cells.Add(cell)
  Dim cb As CheckBox = New CheckBox
  cb.Text = s
  cell.Controls.Add(cb)
Next
form1.Controls.Add(m_Table)
End Sub

Ved ikke om det funger, men det er sikkert tæt på.

Mvh
Avatar billede kak Nybegynder
23. maj 2006 - 14:50 #20
Så lykkes det endeligt :-) Jeg skulle blot lave...

Dim cb As CheckBox = CType(ConversionHelpers.AsWorkaround(row.Cells(0).Controls(0), GetType(CheckBox)), CheckBox)

.. om til ...

Dim cb As CheckBox = CType(row.Cells(0).Controls(0), CheckBox)

Tusind tak for hjælpen! Du har bestemt fortjent dine point, så smider du et svar?
Avatar billede snepnet Nybegynder
23. maj 2006 - 16:07 #21
Jeps - det kommer her :o)
Mvh
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