[ASP.NET] DataBinder.Eval

Pagina: 1
Acties:

  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Ik heb een Repeater op mijn aspx pagina, met voor elk RepeaterItem een CheckBox control. Deze Repeater 'Bind' ik aan een tabel uit een database. Nou wil ik de ID van elke checkbox gelijkzetten aan de ID van de betreffende rij uit de tabel in de database. Dit probeer ik zo:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<asp:Repeater ID="repTest" Runat="server">
  <ItemTemplate>
    <table width="700"><tr>
      <td width="30" valign="top">
        <asp:CheckBox Runat="server" ID='<%# DataBinder.Eval(Container.DataItem, "Id") %>' />
      </td>
      <td width="100" valign="top">
        <%# DataBinder.Eval(Container.DataItem, "Naam") %>
      </td>
      <td width="520">
        <%# DataBinder.Eval(Container.DataItem, "Omschrijving") %>
      </td>
    </tr></table>
  </ItemTemplate>
</asp:Repeater>

Als ik nu in Visual Studio overschakel van HTML view naar Design view geeft ie aan: Error Creating Control - Parser Error op de ID van de checkbox. En als ik de page run dan geeft ie de foutmelding dat <%# DataBinder.Eval(Container.DataItem, "Id") %> een invalid identifier is.
Als ik de property ID vervang door bijv. Text dan gaat het wel goed.

Dus: is het mogelijk om een waarde aan de ID property van een Checkbox control toe te wijzen?

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Dat gaat niet lukken met een servercontrol.
Setting this property on a server control provides you with programmatic access to the server control's properties, events, and methods.
Hoe zou je die checkbox dan bijvoorbeeld in je codebehind willen aanroepen?
En waarom laat je het genereren van die id niet over aan asp.net?

| Toen / Nu


  • Jabbah
  • Registratie: Februari 2004
  • Laatst online: 21-05 11:01
Ik wil graag na een druk op een knop, alle Items uit de Repeater doorlopen en van elke checkbox weten of ie 'Checked' is. Als dat zo is, dan wil ik de ID van de database record opslaan.
Een vieze manier is om de ID in een aparte cell van de tabel in de Repeater te stoppen en textgrootte 0 maken, maar ik had gehoopt dat ik de ID vd database rij in de ID van de CheckBox kon stoppen.

Moet ik een vieze workaround bedenken of is er een truc voor?

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Voeg een label toe die invisible is.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<asp:Repeater ID="repTest" Runat="server">
  <ItemTemplate>
<asp:Label id="myID" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Id") %>' Visible=False></asp:Label>
    <table width="700"><tr>
      <td width="30" valign="top">
        <asp:CheckBox Runat="server" ID='myChk' />
      </td>
      <td width="100" valign="top">
        <%# DataBinder.Eval(Container.DataItem, "Naam") %>
      </td>
      <td width="520">
        <%# DataBinder.Eval(Container.DataItem, "Omschrijving") %>
      </td>
    </tr></table>
  </ItemTemplate>
</asp:Repeater>

En dan doorloop je alle item in de Click-eventhandler.

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
Volgens mij kun je gewoon de ID een vaste naam geven en met RepeaterItem.FindControl("checkbox") de checkbox instantie uit de betreffende repeateritem kunnen halen. Je hoeft die checkboxes geen aparte ID's te geven, daar zorgt het framework voor.

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Precies..
code:
1
2
3
4
5
6
7
8
9
10
foreach (RepeaterItem item in repTest.Items)
{
    Label lbl = (Label)item.FindControl("myID");
    CheckBox chk = (CheckBox)item.FindControl("myChk");
    if (chk.Checked)
    {
        int ID = Convert.ToInt32(lbl.Text);
        // Doe iets met ID
    }
}

  • Folkert
  • Registratie: September 2001
  • Laatst online: 17:45
waarom gebruik je niet de checkboxListItem?

ASP.NET:
1
<asp:CheckBoxList id="chkList" Runat="server"></asp:CheckBoxList>


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 Dim Count As Integer = 0
        While Count < ds.Tables(2).Rows.Count

            Dim L As ListItem = New ListItem
           
            Dim sb As StringBuilder = New StringBuilder
            sb.Append("<b>")
            sb.Append(ds.Tables(2).Rows(Count).Item("nummer"))
            sb.Append("</b>")
            sb.Append("&nbsp;")
            sb.Append("(")
            sb.Append(ds.Tables(2).Rows(Count).Item("name"))
            sb.Append(")")

            L.Text = sb.ToString
            L.Value = ds.Tables(2).Rows(Count).Item("typeID")
            chkList.Items.Add(L)

            Count = Count + 1
        End While


Ik heb het ooit op deze manier opgelost aangezien de bij checkboxList alleen maar een enkele colom kan selecteren als dataItemText dus vandaar dat je er een loop voor moet maken om de listItems te definieren...

[ Voor 136% gewijzigd door Folkert op 23-07-2004 14:37 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:50

gorgi_19

Kruimeltjes zijn weer op :9

Gekke vraag, maar waarom ebruik je daar een stringbuilder voor? String.Format lijkt me hier beter geschikt voor.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Folkert
  • Registratie: September 2001
  • Laatst online: 17:45
String.Format kan ook, voor het overzicht vind ik de stringBuilder altijd wel prettig werken...

Format.string variant:
Visual Basic .NET:
1
2
L.Text = String.Format("<b>{0}</b>&nbsp;({1})", ds.Tables(2).Rows(Count).Item("nummer"), _
ds.Tables(2).Rows(Count).Item("name"))


Moet toegeven, dat dit ook wel ok is.... ;)

[ Voor 55% gewijzigd door Folkert op 23-07-2004 14:53 ]

Pagina: 1