[ASP.NET] dropdownlist in datagrid probleem

Pagina: 1
Acties:

  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Ik ben redelijk nieuw tot .NET en ASP, en ik heb de volgende problemen:

Ik heb een datagrid die gebonden is met een data source. In dit datagrid wil ik een pulldown menu. Het pulldown menu zit in de datagrid en wordt ook goed gevuld. Echter ik heb de volgende vragen:

- Als ik op edit kies in het datagrid is de ingevulde waarde van het pulldown menu niet geselecteerd en staat er gewoon de eerste waarde in de lijst.

- Hoe haal ik een waarde uit dit pulldown menu. Ik heb geprobeerd met de methode getControl("naam dropdown"), dit werkt echter niet. Hoe kan ik deze control aanspreken?

Mijn template voor de colom ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
<ItemTemplate>
   <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Sept Type") %>'>
   </asp:Label>
</ItemTemplate>
<EditItemTemplate>
 <asp:DropDownList runat="server" id="lstValueTypeSept" DataValueField="ValueTypeID" DataTextField="Name" DataSource='<%# Bind()%>'>
 </asp:DropDownList>
</EditItemTemplate>


De methode Bind() geeft een DataSet terug (de lijst is compleet).

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Doe eens gek, tik het in op Google

En vertel eens wat, pakweg, er niet goed is aan de 1e 3 links. :)

En voor het selected maken
klik

[ Voor 31% gewijzigd door gorgi_19 op 10-10-2003 08:56 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Je moet in het OnItemDataBound gaan nagaan of het huidige row de editted row is, en zoja, dan moet je index van de combobox op de juiste waarde zetten.

De combobox kan je aanspreken door de Controls property uit te lezen:

Dat moet zoiets zijn:
code:
1
DropDownList mydd = (DropDownList)MyDataGrid.Rows[e.ItemIndex].Controls[1];

[ Voor 39% gewijzigd door whoami op 10-10-2003 09:51 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 10 October 2003 @ 09:49:
Je moet in het OnItemDataBound gaan nagaan of het huidige row de editted row is, en zoja, dan moet je index van de combobox op de juiste waarde zetten.

De combobox kan je aanspreken door de Controls property uit te lezen:

Dat moet zoiets zijn:
code:
1
DropDownList mydd = (DropDownList)MyDataGrid.Rows[e.ItemIndex].Controls[1];
* gorgi_19 vindt dat whoami moeilijk doet in dit geval.. :P

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<asp:TemplateColumn HeaderText="Category">
  <ItemTemplate>
    <%# DataBinder.Eval(Container.DataItem, "CategoryName") %>
  </ItemTemplate>
      
  <EditItemTemplate>
    <asp:DropDownList runat="server" id="lstCategories"
         DataValueField="FAQCategoryID"
         DataTextField="Name"
         DataSource="<%# GetCategories() %>" 
         SelectedIndex='<%# GetSelIndex(Container.DataItem("FAQCategoryID")) %>'
    />
   </EditItemTemplate>               
</asp:TemplateColumn>

Zie het gedeelte van SelectedIndex. (Bron: http://aspnet.4guysfromrolla.com/articles/080702-1.3.aspx)

[ Voor 13% gewijzigd door gorgi_19 op 10-10-2003 10:16 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Ok ik het is gelukt om de data op de goede waarde te zetten!

Alleen lukt het uitlezen nog niet, wanneer ik .controls[x] gebruik krijg ik een cast error, en als ik findControl() gebruik dan krijg ik een null pointer terug.

Maar het komt waarschijnlijk omdat op het moment dat ik hem uit wil lezen, het nog geen dropdownbox is maar een label. Ik snap er weinig van op dit moment.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Kijk eens van welk type controls[x] is.
Normaal gezien is Controls[0] de 'gewone' template.
Controls[1] is de EditTemplate dacht ik....

code:
1
2
3
4
if( e.Item.ItemType == ListItemType.EditItem )
{
    DropDownList ddl = (DropDownList)(e.Item.Cells[2].Controls[1]);
}

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
gorgi_19 schreef op 10 October 2003 @ 10:15:
[...]

* gorgi_19 vindt dat whoami moeilijk doet in dit geval.. :P
Mja, je kunt het inderdaad ook zo doen, maar eigenlijk hou ik niet zo van dat HTML gedeelte.
* whoami blijft liever in de code-behind.

https://fgheysels.github.io/


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Hij loopt vast op die control[] commando.

Is er geen mogelijkheid om de label uit te lezen? Dus als de datagrid niet in editmode is gewoon van die regel en een bepaalde cel de waarde van de label uitlezen. Ik moet dit namelijk hebben om te kijken of ik een ander veld een kleurje moet geven.

Als hij geedit wordt moet ik pas van de dropdownlist de waarde hebben.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Als de datagrid niet in edit mode is, dan lees je Controls[0] uit.
Je moet wel zeker zijn dat je naar het goede type cast.
Je kan altijd eens kijken welk type het is, door de GetType() method aan te roepen:
code:
1
e.Item.Cells[x].Controls[i].GetType();

https://fgheysels.github.io/


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Specified argument was out of the range of valid values. Parameter name: index

code:
1
2
3
Line 508:   private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
Line 509:   {
Line 510:   e.Item.Cells[0].Controls[0].GetType();


heb verschillende waardes in de Cells[x] en Controls[x] geprobeerd maar niets lijkt te werken.

  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Het werkt, het probleem was dat de index de eerste keer -1 is van de grid. Met het probleem dat er nog niets is (waarschijnlijk is dit de header row).

Maar door een extra controle werkt:

code:
1
2
3
4
if(e.Item.DataSetIndex != -1)
{
     a = (Label)e.Item.FindControl("labelValueTypeSept");
}

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Daarom moet je ook e.ItemType controleren. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Het gebruik van Cells[x] en Controls[x] werkt nog steeds niet. Allen FindControl()

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

hiostu schreef op 10 October 2003 @ 12:09:
Het gebruik van Cells[x] en Controls[x] werkt nog steeds niet. Allen FindControl()
Aangezien de methodiek correct is, kan je twijfelen of de cell- en /of control verwijzing correct is.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Wat werkt er dan niet?
Als je item geëdit is, en je hebt een ItemTemplate column, dan moet je controls[1] uitlezen, anders moet je controls[0] uitlezen.

https://fgheysels.github.io/


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
code:
1
b = e.Item.Cells[1].Controls[0].GetType().ToString();


geeft de volgende error:

Specified argument was out of the range of valid values. Parameter name: index

En dat is dus niet in edit mode.

[ Voor 9% gewijzigd door hiostu op 10-10-2003 12:26 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Dan is voor die betreffende row of te weinig cells, of te weinig controls.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Doh, idd het lag er aan dat hij de eerst rows niet als controls zag. Ik krijg nu als control de label terug. Dit was echter wel alleen in Control[1], bij Control[0] krijg ik een Literal terug

Iedereen iig tot zo ver bedankt voor de hulp!

  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Ok ik dacht dus dat het werkte maar dat bleek niet helemaal het geval te zijn. nu is het volgende aan de hand:

Ik heb dus om de 2 colommen een Label en een dropdownlist heb (dus afhankelijk van edit of normaal zoals eerder beschreven). Ik wil al die labels uitlezen. Dus heb ik het volgende gedaan:

code:
1
2
3
4
5
6
7
8
int i = 2;
while (i < 25)
{
   a = (Label)e.Item.Cells[i+1].Controls[1];
   //normal
   if(a.Text == "0")
       e.Item.Cells[i].BackColor = System.Drawing.Color.LightGreen;
}

Ik blijf alleen heel de tijd dezelfde waarde terug krijgen terwijl deze wel verschillen. Ik denk dat elke keer dezelfde control aangesproken wordt.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Lees de post van whoami eens over OnItemDataBound.
Ik heb geen idee waar je mee bezig bent, maar je doet veel en veel te moeilijk.

[ Voor 46% gewijzigd door gorgi_19 op 10-10-2003 14:32 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
ik doe het in de functie OnItemDataBound alleen gaat het over horizonaal. Dus in dezelfde rij staan er meerdere controls.

En hoezo doe ik veel te moeilijk?

Ik zal het uitleggen:

Ik heb een aantal waarden die ingedeeld zijn per maand. Deze hebben ook een type die ingevuld wordt in het veld wat er naast staat. Bij het overzicht zijn de kleur van het veld afhankelijk van het type. Echter als er geedit wordt moet het type ook gewijzigd kunnen worden en dient deze dus zichtbaar te worden in de vorm van een dropdownmenu.

[ Voor 63% gewijzigd door hiostu op 10-10-2003 14:35 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

hiostu schreef op 10 October 2003 @ 14:33:
ik doe het in de functie OnItemDataBound alleen gaat het over horizonaal. Dus in dezelfde rij staan er meerdere controls.
Dan doe je nog te moeilijk; De cells is een collection, en deze zullen ws wel een Count property hebben oid. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
shit mijn excuses het werkte al wel. Ik heb alleen de templates verkeerd gecopy-paste zodat deze aan dezelfde colom in de DB gebonden werden O-)

Mijn excuses

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:38
Ben je trouwens wel zeker dat e.Item.Cells[n].Controls[1] altijd een Label is?

https://fgheysels.github.io/


  • hiostu
  • Registratie: Juli 2000
  • Laatst online: 05-05 13:13
Volgens mij wel, want de velden zitten om en om, een dataveld en een typeveld
Pagina: 1