webForumDet fria alternativet

Problem med att fylla dropdown

17 svar · 574 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

Jag har en dropdown i en edittemplate som jag vill fylla med värden från en access databas. Men dropdownen blir tom

Public Sub datagrid1_edit(ByVal obj As Object, ByVal e As DataGridCommandEventArgs)
        datagrid1.EditItemIndex = e.Item.ItemIndex
        filldata()
        datagrid1.DataBind()

    End Sub

    Public Sub filldata()
        Dim dpllag_a As DropDownList = New DropDownList()
        Dim dpllag_b As DropDownList = New DropDownList()
        Dim objcmd1 As New OleDbDataAdapter _
                         ("select Namn, Id from deltagande_lag where Cup_id=" & viewstate("c_id") & " order by id", objconn)
        Dim ds1 As DataSet = New DataSet()
        objcmd1.Fill(ds1, "deltagande_lag")
        dpllag_a.DataSource = ds1.Tables("deltagande_lag")
        dpllag_a.DataBind()
        dpllag_b.DataSource = ds1.Tables("deltagande_lag")
        dpllag_b.DataBind()

    End Sub

Och så här skriver jag dropdownlisten

<asp:dropdownlist id="dpllag_a" width="120" runat="server" visible="True" DataTextField="Namn" DataValueField="id" />

hur gör jag för att kolla om värdet i datgriden är samma som den i dropdownen och gör så att den blir selected?

LeffoMedlem sedan juni 200239 inlägg
#2

Kolla om du skickar rätt datatyp,
konverta "c_id" till int om det är en string och tvärtom. inte alls säker på att det är just det problemet du har men jag har råkat ut för det.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#3

Tack för tipset men tyvärr så hjälpte inte det

NETworkMedlem sedan juni 20011 732 inlägg
#4

Eftersom du har din kontroll i en annan kontroll så gissar jag att du måste göra en findcontrol på din datagrid för att hitta din dropdownlist. Alternativt att du sätter datasource='funktion(värde)' i din ddl, alltså en funktion som returnerar giltig data att fylla den med...

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#5

Eftersom du har din kontroll i en annan kontroll så gissar jag att du måste göra en findcontrol på din datagrid för att hitta din dropdownlist.

Hur gör jag det? Gör jag likadant som när jag hittar textboxar i en datagrid?

juventus1Medlem sedan dec. 2000399 inlägg
#6

Ja, precis på samma sätt oavsett vad det är för kontroll som ligger i en datagrid.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#7

jag testade med det här

Public Sub datagrid1_edit(ByVal obj As Object, ByVal e As DataGridCommandEventArgs)
        Dim dpllaga As DropDownList = e.Item.FindControl("dpllaga")
        Dim dpllagb As DropDownList = e.Item.FindControl("dpllagb")
        datagrid1.EditItemIndex = e.Item.ItemIndex
        Dim objcmd1 As New OleDbDataAdapter _
                         ("select Namn, Id from Deltagande_lag where Cup_id=" & viewstate("c_id") & " order by id", objconn)
        Dim ds1 As DataSet = New DataSet()
        objcmd1.Fill(ds1, "deltagandelag")
        dpllaga.DataSource = ds1.Tables("deltagandelag"). _
        DefaultView
        dpllaga.DataBind()
        dpllagb.DataSource = ds1.Tables("deltagandelag"). _
        DefaultView
        dpllagb.DataBind()
        datagrid1.DataBind()

    End Sub

Då får jag detta felmeddelandet

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

Line 53:         Dim ds1 As DataSet = New DataSet()
Line 54:         objcmd1.Fill(ds1, "deltagandelag")
Line 55:         dpllaga.DataSource = ds1.Tables("deltagandelag"). _
Line 56:         DefaultView
Line 57:         dpllaga.DataBind()
 

Source File: h:\inetpub\wwwroot\cup\spelschema.aspx.vb    Line: 55
juventus1Medlem sedan dec. 2000399 inlägg
#8

Prova detta:

For i = 0 To dataGrid1.Items.Count - 1
   dataGrid1.Items(i).FindControl("dpllaga").DataSource = ds1.Tables("deltagandelag")
dataGrid1.Items(i).FindControl("dpllagb").DataSource = ds1.Tables("deltagandelag")
Next
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#9

jag provade med det men får då
'DataSource' is not a member of 'System.Web.UI.Control'.

på dataGrid1.Items(i).FindControl("dpllaga").DataSource = ds1.Tables("deltagandelag")

NETworkMedlem sedan juni 20011 732 inlägg
#10

Vet inte hur det är i vb, men i c# så måste du även skriva vilken typ av object det är:

((DropDownList)dataGrid1.Items(i).FindControl("dpllaga")).DataSource

Sen vet du ju vilket index det är som startat eventet med e.Item.ItemIndex så du behöver inte loopa igenom hela datagriden!

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#11

Jag testade med det här

CType(e.Item.FindControl("dpllaga"), DropDownList).DataSource = ds1.Tables("deltagandelag")

Men får då återigen felet
Object reference not set to an instance of an object.

Source Error: 

Line 52:         objcmd1.Fill(ds1, "deltagandelag")
Line 53: 
Line 54:         CType(e.Item.FindControl("dpllaga"), DropDownList).DataSource = ds1.Tables("deltagandelag")
Line 55:         CType(e.Item.FindControl("dpllagb"), DropDownList).DataSource = ds1.Tables("deltagandelag")
Line 56:         dpllaga.DataBind()
 

Source File: h:\inetpub\wwwroot\cup\spelschema.aspx.vb    Line: 54
NETworkMedlem sedan juni 20011 732 inlägg
#12

Du måste nog fortfarande göra din findcontrol på din datagrid alltså, nåt sånt här:

.....dataGrid1.Items(e.Item.ItemIndex).FindControl.....
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#13

blir fortfarande samma fel

NETworkMedlem sedan juni 20011 732 inlägg
#14

Hm, vi tar den enkla varianten istället. :)

<edititemtemplate>
  <asp:dropdownlist DataSource='<%# Function(DataBinder.Eval(Container, "DataItem.Data")) %>' Runat="server"></asp:dropdownlist>
</edititemtemplate>

//och sen en funktion:

protected datasource Function (object o) {
  //vb-kod som jag inte kan...
  return datasource
}

Ja, nåt sånt borde funka...

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#15

Tack. Nu fungerar det.

Här är funktionen

Public Function filldg()
        Dim objcmd1 As New OleDbDataAdapter _
                         ("select Namn, Id from Deltagande_lag where Cup_id=" & viewstate("c_id") & " order by id", objconn)
        Dim ds1 As DataSet = New DataSet()
        objcmd1.Fill(ds1, "deltagandelag")

        Return ds1.Tables("deltagandelag")
    End Function

En fråga till. Hur får jag "rätt" värde selected i dropdownen

NETworkMedlem sedan juni 20011 732 inlägg
#16

andreas_lindh skrev:

Tack. Nu fungerar det.
En fråga till. Hur får jag "rätt" värde selected i dropdownen

Jadu, då behöver du antagligen få tag på din dropdownlist i alla fall. Jag är tyvärr en sopa på vb men det ska fungera att göra nåt i den här stilen:

((DropDownList)DataGrid1.Items[e.Item.ItemIndex].FindControl("myDropDownList")).Items.FindByText("text").Selected = bool;

Först tar du alltså ut det index (rad) i din datagrid d'är eventet inträffade, sedan kör du en findcontrol för att hitta kontrollen (kan även göras manuellt genom att ange i vilken kolumn din ddl finns) och därefter söker du på en given text i dropdownlisten och sätter den till selected = true. Någon som är bättre på vb än mig kanske kan ge ett fungerande vb-exempel?

Alternativt kanske du kan labba lite med attributet selectedindex i din dropdownlist och göra någon liknande funktion som du gjorde när du fyllde den?

NETworkMedlem sedan juni 20011 732 inlägg
#17

Titta i den här tråden längst ned, Dino har hittat en smidig lösning på ditt problem! :)

http://www.webforum.nu/showthread.php?s=&threadid=64918

xrobxMedlem sedan mars 2003106 inlägg
#18

ops, blev lite fel där.

137 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)