Avatar billede uas Nybegynder
29. november 2007 - 15:05 Der er 22 kommentarer

Dropdownlist gridview

Hej

Jeg har et gridview hvori jeg har en dropdownlist i EditItemTemplate. Hvordan tilgår jeg dropdownlisten så jeg f.eks kan sætte dens selected værdi?

Nedenstående er hvad jeg har indtil videre, men det virker ikke?

default.aspx
<asp:GridView ID="GridView1" AutoGenerateEditButton="true" DataSourceID="ObjectDataSource1" runat="server"
            AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" />
                <asp:BoundField DataField="Navn" HeaderText="Navn" />
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DropDownList1" DataSourceID="ObjectDataSource1" DataTextField="Navn" DataValueField="id" runat="server">
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
               
            </Columns>
           
        </asp:GridView>
   
 
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
            SelectMethod="getData" TypeName="Class1"></asp:ObjectDataSource>


default.aspx.vb:

Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing

Dim dll As DropDownList
dll = CType(GridView1.Rows(e.NewEditIndex).FindControl("DropDownList1"), DropDownList)
dll.SelectedIndex = 5

End Sub
Avatar billede uas Nybegynder
29. november 2007 - 15:09 #1
den kommer iøverigt med denne fejl når jeg forsøger:

Objektreferencen er ikke indstillet til en forekomst af et objekt.
Avatar billede neoman Novice
29. november 2007 - 15:19 #2
Ligger dit gridview i en anden container såsom placeholder/panel ?
Avatar billede uas Nybegynder
29. november 2007 - 15:21 #3
nej, den ligger i den <div>. Men det ved jeg ikke om det tæller ?
Du får lige hele koden:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
   
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
   
        <asp:GridView ID="GridView1" AutoGenerateEditButton="true" DataSourceID="ObjectDataSource1" runat="server"
            AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" />
                <asp:BoundField DataField="Navn" HeaderText="Navn" />
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DropDownList1" DataSourceID="ObjectDataSource1" DataTextField="Navn" DataValueField="id" runat="server">
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
               
            </Columns>
           
        </asp:GridView>
   
 
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
            SelectMethod="getData" TypeName="Class1"></asp:ObjectDataSource>
   
 
    </div>
    </form>
</body>
</html>
Avatar billede neoman Novice
29. november 2007 - 15:27 #4
Det forekomemr mig umiddelbart rigtigt, såå...

I handleren, split dll = CType(GridView1.Rows(e.NewEditIndex).FindControl("DropDownList1"), DropDownList)
ud på de alle de indgående elementer, og så kan du i debuggeren se hvilket element giver den manglende reference
Avatar billede uas Nybegynder
29. november 2007 - 15:35 #5
jeg ved at den har fat i det rigtigt row, da jeg har skrevet e.NewEditIndex ud. Så der er fra .FindControl("DropDownList1") det går galt...
Avatar billede neoman Novice
29. november 2007 - 15:52 #6
du gætter bare - jeg vil gerne vide om det er der der går galt, eller om det er selve gridviewet ikke kan få fat i

skriv ud Gridview1.rows.count i selve handleren, hvis du ikke kan finde ud af at bruge debuggeren, og sig om det gik ok
Avatar billede uas Nybegynder
29. november 2007 - 15:56 #7
GridView1.Rows.Count kommer med 107, og det passer med det antal record der er. Så vi har fat i gridviewet
Avatar billede neoman Novice
29. november 2007 - 15:58 #8
ok fint. har du noget som helst i din code behind (udover det allerede viste) som gør noget som helst med/ved dit gridview, eller din ddl ?
Avatar billede neoman Novice
29. november 2007 - 15:59 #9
f.eks. at du sætter en kollonne til Visible=False eller noget ?
Avatar billede uas Nybegynder
29. november 2007 - 16:02 #10
nej, det er det eneste jeg har i min code behind
Avatar billede neoman Novice
29. november 2007 - 16:19 #11
ok  svaret er at row_editin indtræffer når du klikker på Edit, men den ahr nednu ikke switchet til EditMode hvorfor de kontroller som  ligger i dine EditTemplate(s) endnu ikke er tilgængelige.

Hvis du skal sætte noget skal du gøre det i RowDataBound eventen, ogbruge følgende test:
If e.Row.RowState = DataControlRowState.Edit  Then
' gør det du skal
' di nrow har indexs e.Row.Rowindex
End If
Avatar billede uas Nybegynder
29. november 2007 - 16:35 #12
hej neoman

Er vi ikke engiom at det skal se sådan ud så?

    Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowState = DataControlRowState.Edit Then
            Dim dll As DropDownList

            dll = CType(GridView1.Rows(e.Row.RowIndex).FindControl("DropDownList1"), DropDownList)
            dll.SelectedIndex = 5

        End If
    End Sub

det virker bare ikke. får fejlen:
Indekset lå uden for området. Det må ikke være negativt og skal være mindre end størrelsen på samlingen.
Parameternavn: index
Avatar billede uas Nybegynder
29. november 2007 - 16:36 #13
engiom = enig om
Avatar billede neoman Novice
29. november 2007 - 16:38 #14
det er nok din dll som endnu ikke bound:

prøv
          dll = CType(GridView1.Rows(e.Row.RowIndex).FindControl("DropDownList1"), DropDownList)
          dll.DataBind()
        dll.SelectedIndex = 5
Avatar billede uas Nybegynder
29. november 2007 - 16:45 #15
nej, samme fejl. Fejlen kommer i denne linie

dll = CType(GridView1.Rows(e.Row.RowIndex).FindControl("DropDownList1"), DropDownList)
Avatar billede neoman Novice
29. november 2007 - 16:46 #16
har du 6 items i din ddl?
Avatar billede uas Nybegynder
29. november 2007 - 16:48 #17
nej, det er der er også 107. dll og gridview bruger samme datasource
Avatar billede neoman Novice
29. november 2007 - 16:56 #18
fatter nada

kommenter dll.SelectedIndex = 5 ud og
skriv ddl.Items.Count ud
Avatar billede uas Nybegynder
29. november 2007 - 16:59 #19
det hjælper vel ikke noget. Fejlen kommer i linien ovenover.
dll = CType(GridView1.Rows(e.Row.RowIndex).FindControl("DropDownList1"), DropDownList)
Avatar billede neoman Novice
29. november 2007 - 17:03 #20
se - det er altid en hjælp at vide hvilken linje jo!!!!!!!!!!!!!!!!!!!!

1. prøv ændre
If e.Row.RowState = DataControlRowState.Edit Then
til
        If e.Row.RowState = DataControlRowState.Edit And e.Row.RowType = DataControlRowType.DataRow Then


2. lær at bruge debuggeren :
1. klik på grå vetikal bjælke  yderst til vesntre i kodevinduet
2. du får en rød klat - der vil koden stoppe næste gang
3. klik på ikonet ( i en af menulinjerne som hedder) STEP OVER - så kan du skridet frmead i koden
4 .du se variabel værdierne ved at holde musen over dem
5. du kører videre ved at tryke på den grønne knap
6. du fjerner break pointet (den røde klat) ved at klikke på den igen
Avatar billede uas Nybegynder
30. november 2007 - 08:37 #21
det skrev jeg vist allerede i indlægget fra kl. 16:45:36 :-)

Men jeg kan skam god finde ud af at bruge debuggeren.

Og nu kommer det underlige. Det er faktisk kun nogle gange at den kommer til de breakpoints som jeg har sat. Jeg har bla. sat et ved linien der fejler. Og når den så kommer derind så er "fejlkassen" vedhæftet til FindControl("DropDownList1")
Avatar billede neoman Novice
30. november 2007 - 11:26 #22
"kun nogle gange" ??? Eftersom RowDataBound kaldes for hvert Row - så SKAL den pinedød breake der ved hver DataBind og for hver datarow.

Hvad mener du med "nogle gange" - betyder det at den ved nogle dataBind SLET ikke kommer ind der ? Eller at den kommer ind hver gang du databinder, men ikke for HVER linje ?

Jeg kan ikke umiddelbart se noget galt i den mekanik du har skruet sammen, så det eneste andet sted der kunne være noget er formentligt din ObjectDataSource
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