Avatar billede wildthing Nybegynder
08. juni 2007 - 15:41 Der er 24 kommentarer og
1 løsning

events i gridview der er indlejret i en detailsview

Jeg har en detailsview hvori jeg har en templatefield, hvori jeg har en liste i form af et gridview. Når jeg deleter vil jeg anvende event "rowdeleting" til i min codebehind at slette en fil i filsystemet. Problemet er at de felter jeg har i mit gridview kan jeg ikke få fat på, og det skal jeg kunne for at få oplysninger om hvilken fil jeg skal slette.

har prøvet med

... gridview.findcontrol("label1")...  men den er hele tiden "nothing"

Er der et lyst hoved der forstår mit spørgsmål og kan give mig en ide om hvorledes jeg får fat i de værdier, jeg er ved at skulle slette...
Avatar billede neoman Novice
08. juni 2007 - 16:02 #1
I en gridview skal du først have fat i den row som du søger i. Her et eksempel på at finde en checkbox i en gridview row vedRowDataBound - ligner sikkert for RowDeleting - kig på hvilke properties "e" har i det event:

    Protected Sub GridView2_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView2.RowDataBound
        Dim gvRow As GridViewRow
        gvRow = e.Row
        If gvRow.RowType = DataControlRowType.DataRow Then
            If CType(gvRow.FindControl("CheckBox2"), CheckBox).Checked = True Then
              '' blabla
            End If
            ' mere bla bla
        End If
    End Sub
ovenstående forudat at det felt du leder efter selv sidder i en template i gridviewét.

Hvis ikke, så har et gridviewrow en cells collection, som indeholder data, f.eks. :

gridviewrow.cells(x).text, hvor x er index for cellen
Avatar billede dr_chaos Nybegynder
09. juni 2007 - 15:45 #2
du gør sådan her:
protected void onrowdeleting ( Object sender, GridViewDeleteEventArgs e )
{

gridview.Rows(e.RowIndex).findcontrol("label1")

}

Se evt her:
http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewdeleteeventargs_members.aspx
Avatar billede wildthing Nybegynder
11. juni 2007 - 11:20 #3
Super neoman og  dr_chaos, men umiddelbart løser det ikke mit problem.

neoman> e.row is not a member of system.web.ui.webcontrols.gridviewdeleteeventarguments.

Dr_chaos>
    Protected Sub GridView2_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs)
        Dim xx As TextBox = GridView2.Rows(e.RowIndex).findcontrol("TextBoxfilename")
    End Sub

siger at Gridview2 is not declared, og det stemmer lidt med mit problem som jeg vil skyde på er fordi at jeg har mit gridview inde i et detailsview.

følgende kode er min editItemTemplate som ligger i Detailsview1
      <asp:TemplateField HeaderText="Attachments" SortExpression="Attachedfiles">
                <EditItemTemplate>
                    &nbsp; &nbsp; &nbsp;
                    <table style="width: 526px">
                        <tr>
                            <td style="height: 25px" valign="top">
                                <asp:FileUpload ID="FileUpload_editattachments" runat="server" Width="332px" />&nbsp;
                                <asp:Button ID="Button_editupload" runat="server" Text="Upload" OnClick="Button_editupload_Click" />
                                <asp:Label ID="Label1_warning" runat="server" Width="190px"></asp:Label><br />
                            </td>
                        </tr>
                        <tr>
                            <td valign="top">
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" DataKeyNames="Taskno,seq"
        DataSourceID="SqlDataSource1" CellPadding="4" ForeColor="#333333" GridLines="None" OnRowDeleting="GridView2_RowDeleting">
        <Columns>
            <asp:CommandField ShowDeleteButton="True" />
            <asp:TemplateField HeaderText="filename" SortExpression="filename">
                <EditItemTemplate>
                    <asp:TextBox ID="TextBoxfilename" runat="server" Text='<%# Bind("filename") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Labelfilename" runat="server" Text='<%# Bind("filename") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Task_GUID" HeaderText="Task_GUID" SortExpression="Task_GUID"
                >
                <ItemStyle Width="10px" Wrap="False" />
                <HeaderStyle Width="10px" Wrap="False" />
            </asp:BoundField>
        </Columns>
    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <RowStyle BackColor="#EFF3FB" />
    <EditRowStyle BackColor="#2461BF" />
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <AlternatingRowStyle BackColor="White" />
    </asp:GridView>
                            </td>
                        </tr>
                    </table>
                </EditItemTemplate>
Avatar billede neoman Novice
11. juni 2007 - 11:31 #4
Ja ok - men e.RowIndex er, iht. dokumentationen for GridViewDeleteEventArgs ,  index for den row du ønsker at delete. Den burde dukke op i din intellisense.

Og fordi din gridview sidder i en template  så skal den findes på samme måde :

Dim myGridView as GridView


myGridView=DetailsView1.Rows(rowIndex).FindControl("GridView2"), hvor rowIndex er index for den row som dit GridView ligger i

http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.rows(vs.80).aspx
Avatar billede wildthing Nybegynder
11. juni 2007 - 12:32 #5
chaos>
mente sådan istedet, men den siger at Grdiview2 ikke er declared??
Dim xx As TextBox = CType(GridView2.Rows(e.RowIndex).findcontrol("TextBoxfilename"), TextBox)
Avatar billede wildthing Nybegynder
11. juni 2007 - 12:34 #6
neoman>
brokker sig over rowindex (is not delared!). er det åbentlyst forkert det jeg gør, ellers må jeg prøve mig lidt mere ihærdigt frem...

        Dim row As DetailsViewRow = DetailsView1.Rows(1)
        Dim nn As String = row.Cells(1).Text
        Dim ee As GridView
        ee = DetailsView1.Rows(rowindex).FindControl("GridView2")
        Dim dd As TextBox
        dd = ee.FindControl("TextBoxfilename")
Avatar billede wildthing Nybegynder
11. juni 2007 - 14:10 #7
Dr_Chaos>
dit eksempel virker på et gridview der ikke ligger inde i et templatefield i et detailsview. Jeg har oprettet et Gridview3 og den fanger "filename"...

    Protected Sub GridView3_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView3.RowDeleting
        Dim xx As Label = CType(GridView3.Rows(e.RowIndex).FindControl("labelfilename"), Label)
Avatar billede neoman Novice
11. juni 2007 - 14:24 #8
jeg tror du skal benytte dig af den udmærkede dokumentation ! :)

f.eks:
dim rowIndex as integer = e.rowIndex
Avatar billede neoman Novice
11. juni 2007 - 14:34 #9
oopz - sløjf lige den forrige bemærkning. Den rowindex i mit eksempel - den skal du selv sætte til en værdi. Jeg ved jo ikke i hvilken detailsview row din gridview ligger - det fremgår ikke fra den kode som du har vist. Tæl rækkerne, og så er rowIndex lig med indexet for den række som gridviewet ligger i.
Avatar billede wildthing Nybegynder
11. juni 2007 - 14:45 #10
ok - for jeg havde prøvet  med hjælpen fra chaos at anvende e.rowindex, men den er 0 hele tiden. Jeg ville nu egentlig foretrække at jeg ikke skulle taste et index (hardcodet). Den må for pokker da vide at når jeg trykker på mit gridview, at så er jeg i eks. detailsview.row nr 14 eksempelvis...

Prøver lige om jeg overhovede kan finde ud af hvilken rowindex jeg skal benytte.

synes dette burde virke...
        Dim myGridView As GridView
        myGridView = DetailsView1.Rows(e.RowIndex).FindControl("GridView2")
        Dim dd As Label = CType(myGridView.FindControl("Labelfilename"), Label)

men dd er nothing igen og igen.... jeg tror jeg kaster en rød ferrari eller en brugt Tom K audi i spil her for at få det løst:)
Avatar billede neoman Novice
11. juni 2007 - 14:52 #11
nix - din rowIndex i Detailsview ER hardkodet, fordi  dit gridview ligger jo i en eller anden linje i dit detailsview. Hvis det er den første linje, så er rowIndex=0, anden linje : rowIndex=1 og så fremdeles.
Avatar billede neoman Novice
11. juni 2007 - 14:55 #12
og i øvrigt, for at være på den sikre side, så skal

ee = DetailsView1.Rows(rowindex).FindControl("GridView2")

nok være

ee = Ctype(DetailsView1.Rows(rowindex).FindControl("GridView2"),GridView)

og tilsvarende

dd = ee.FindControl("TextBoxfilename")

skulle så være

dd = Ctype(ee.FindControl("TextBoxfilename"),TextBox)
Avatar billede neoman Novice
11. juni 2007 - 15:01 #13
med andre ord - der er 2 rowindices:

I dit GridView - der er den e.RowIndex, fordi din gridview ved jo hvilken libje du ønsker at slette i.

I dit detailsview - der er det blot indekset for den linje som gridviewet er lagt i.
Avatar billede wildthing Nybegynder
11. juni 2007 - 15:30 #14
jeg kaster mig ud fra et meget højt sted...

Jeg har prøvet rowindex fra 0 til 15, som er det jeg kan uden at ryge "out of range".

uanset hvad... er dd = nothing

mygridview ser fin ud, så den må jo kunne finde gridview2

        Dim myGridView As GridView
        Dim rowindex As Integer
        rowindex = 1
        While rowindex < 16
            myGridView = CType(DetailsView1.Rows(rowindex).FindControl("GridView2"), GridView)
            Dim dd As Label = CType(myGridView.FindControl("Labelfilename"), Label)

            rowindex = rowindex + 1
        End While
Avatar billede neoman Novice
11. juni 2007 - 15:44 #15
Er din DetailsView i EditMode mens du gør dette her ? Hvis den ikke er det, så finder den ikke GridView2, medmindre den også ligger i andre templates.

Du kunne steppe igennem din kode med debuggeren , og se om myGridView er Nothing eller ej. Klik på den grå vertikale bjælke yders til venstre i kode vinduet- så sætter den en brun "klat" og koden vil stoppe eksekveringen der. Så tryk på StepOver i Debug toolbaren...for at steppe. Værdien kan du se ved at holde musen hen over variablen.
Avatar billede neoman Novice
11. juni 2007 - 15:48 #16
og du burde ikke loope over rowindex i din detailsview - du ved jo selv i hvilken række du har lagt din GridView, så bare tag den.
Avatar billede neoman Novice
11. juni 2007 - 15:52 #17
Dim dd As Label = CType(myGridView.FindControl("Labelfilename"), Label)
dette her vil aldrig føre til noget

du SKal jo fortælle den hvilken række du vil lede i :
  Dim xx As Label = CType(myGridView.Rows(e.RowIndex).FindControl("labelfilename"), Label)

hvor e.rowIndex så kommer fra eventhandlerens argumentliste.
Avatar billede wildthing Nybegynder
11. juni 2007 - 20:31 #18
Neoman> At jeg loopede var for at finde om jeg havde bonus et eller andet sted. Jeg ved ikke om jeg har styr på selv at tælle hvor det ligger. Det er det enste jeg brugte kodestumpen til.

Ja jeg har debugget i min codebehind, og mygridview bliver sat lig med gridview2:)

Når jeg kører rowdeleting eventet i et gridview der ikke ligger i et detailsview finder den min itemtemplate, så nej jeg er ikke i det tilfælde i edet. Derfor er edt også en label jeg Ctype'r til.
Avatar billede neoman Novice
12. juni 2007 - 11:47 #19
og bruger du denne her ?  Dim xx As Label = CType(myGridView.Rows(e.RowIndex).FindControl("labelfilename"), Label)
Avatar billede wildthing Nybegynder
12. juni 2007 - 12:49 #20
jeg har et gridview "gridview3" som jeg har udenfor mit detailsview, og i eventet "rowdeleting" virker denne fint

Dim xx As Label = CType(GridView3.Rows(e.RowIndex).FindControl("labelfilename"), Label)

rowindex viser jo vejen for hvilken "labelfilename" i gridview3 jeg er ved at slette.

Når jeg pakker den ind i detailsview går det galt.

Var det svar på dit spørgsmål Neoman.
Avatar billede neoman Novice
16. juni 2007 - 14:53 #21
Jeg tror jeg er lidt tabt nu.
------
Dim xx As Label = CType(GridView3.Rows(e.RowIndex).FindControl("labelfilename"), Label)
rowindex viser jo vejen for hvilken "labelfilename" i gridview3 jeg er ved at slette.
Når jeg pakker den ind i detailsview går det galt.
------
dette vil jo ikke virke, når det ligger inde i en detailsview, da gridview3 er ukendt og skal findes, som det jo vist lykkedes for dig før, vha.:
myGridView = CType(DetailsView1.Rows(rowindex).FindControl("GridView2"), GridView)

Jeg tror ikke vi kommer videre med kode stumper. Prøv lige at paste hele din eventhandler ind her, for det aktuelle gridview som ligger inde i detailsviewet, så kan vi rette den til. Tillige, vis hele skabelonen for dit detailsview, så vi kan regne ud i hvilken række gridviewet ligger.
Avatar billede wildthing Nybegynder
19. juni 2007 - 15:41 #22
Jeg har forsøgt nu at lave en simplificeret udgave på samme problem. Jeg sender her koden. Problemet er det samme. Navnene er lidt anderledes end tidligere, men lad os tage den herfra. tak for at du hænger på Neoman:)

codebehind:
Imports System.Data.SqlClient
Imports System.Data
Imports System.IO

Partial Class test
    Inherits System.Web.UI.Page



    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim intlen, intpos As Integer
        intpos = InStr(Request.ServerVariables("LOGON_USER"), "\")                    'uddrager logonnavn af "DK\at"
        intlen = Len(Request.ServerVariables("LOGON_USER"))                  'uddrager logonnavn af "DK\at"
        Session("userittasks") = LCase(Trim(Right(Request.ServerVariables("LOGON_USER"), intlen - intpos)))

    End Sub





    Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs)
        Dim myGridView As GridView
        Dim rowindex As Integer
        rowindex = 1
        While rowindex < 4
            myGridView = CType(DetailsView1.Rows(rowindex).FindControl("GridView1"), GridView)
            Dim dd As Label = CType(myGridView.FindControl("Label1"), Label)

            rowindex = rowindex + 1
        End While

        '    Dim xx As Label = CType(GridView2.Rows(e.RowIndex).findcontrol("Labelfilename"), Label)

    End Sub
End Class

---------- og siden
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test.aspx.vb" Inherits="test" %>

<!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>
        &nbsp; &nbsp;
        <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="GUID"
            DataSourceID="DS_edit" Height="50px" Width="397px">
            <Fields>
                <asp:BoundField DataField="Taskno" HeaderText="Taskno" SortExpression="Taskno" />
                <asp:BoundField DataField="GUID" HeaderText="GUID" ReadOnly="True" SortExpression="GUID" />
                <asp:TemplateField HeaderText="Attachedfiles" SortExpression="Attachedfiles">
                    <EditItemTemplate>
                        &nbsp;<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Taskno,seq"
                            DataSourceID="DS_attach" OnRowDeleting="GridView1_RowDeleting">
                            <Columns>
                                <asp:CommandField ShowDeleteButton="True" />
                                <asp:TemplateField HeaderText="filename" SortExpression="filename">
                                    <EditItemTemplate>
                                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("filename") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("filename") %>'></asp:Label>
                                    </ItemTemplate>
                                </asp:TemplateField>
                            </Columns>
                        </asp:GridView>
                        <asp:SqlDataSource ID="DS_attach" runat="server" ConflictDetection="CompareAllValues"
                            ConnectionString="<%$ ConnectionStrings:ITtasksConnectionString %>" DeleteCommand="DELETE FROM [Attachments] WHERE [Taskno] = @original_Taskno AND [seq] = @original_seq"
                            OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT [filename], [Taskno], [seq], [Task_GUID] FROM [Attachments] WHERE ([Task_GUID] = @Task_GUID)"
                            >
                            <DeleteParameters>
                                <asp:Parameter Name="original_Taskno" Type="Int32" />
                                <asp:Parameter Name="original_seq" Type="Int32" />
                                <asp:Parameter Name="original_filename" Type="String" />
                                <asp:Parameter Name="original_Task_GUID" Type="Object" />
                            </DeleteParameters>

                            <SelectParameters>
                                <asp:ControlParameter ControlID="DetailsView1" Name="Task_GUID" PropertyName="SelectedValue"
                                    Type="Object" />
                            </SelectParameters>

                        </asp:SqlDataSource>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Attachedfiles") %>'></asp:TextBox>
                    </InsertItemTemplate>
                    <ItemTemplate>
                        &nbsp;<asp:SqlDataSource ID="DS_attach" runat="server" ConflictDetection="CompareAllValues"
                            ConnectionString="<%$ ConnectionStrings:ITtasksConnectionString %>" DeleteCommand="DELETE FROM [Attachments] WHERE [Taskno] = @original_Taskno AND [seq] = @original_seq AND [filename] = @original_filename AND [Task_GUID] = @original_Task_GUID"
                            OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT [Taskno], [seq], [filename], [Task_GUID] FROM [Attachments] WHERE ([Task_GUID] = @Task_GUID)">
                            <DeleteParameters>
                                <asp:Parameter Name="original_Taskno" Type="Int32" />
                                <asp:Parameter Name="original_seq" Type="Int32" />
                                <asp:Parameter Name="original_filename" Type="String" />
                                <asp:Parameter Name="original_Task_GUID" Type="Object" />
                            </DeleteParameters>
                            <SelectParameters>
                                <asp:ControlParameter ControlID="DetailsView1" Name="Task_GUID" PropertyName="SelectedValue"
                                    Type="Object" />
                            </SelectParameters>
                        </asp:SqlDataSource>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="True" />
            </Fields>
        </asp:DetailsView>
        <asp:SqlDataSource ID="DS_edit" runat="server" ConflictDetection="CompareAllValues"
            ConnectionString="<%$ ConnectionStrings:ITtasksConnectionString %>"
            OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT [Taskno], [GUID], [Attachedfiles] FROM [tasks] WHERE ([GUID] = @GUID)"
            UpdateCommand="UPDATE [tasks] SET [Taskno] = @Taskno, [Attachedfiles] = @Attachedfiles WHERE [GUID] = @original_GUID AND [Taskno] = @original_Taskno AND [Attachedfiles] = @original_Attachedfiles">
            <UpdateParameters>
                <asp:Parameter Name="Taskno" Type="Int32" />
                <asp:Parameter Name="Attachedfiles" Type="String" />
                <asp:Parameter Name="original_GUID" Type="Object" />
                <asp:Parameter Name="original_Taskno" Type="Int32" />
                <asp:Parameter Name="original_Attachedfiles" Type="String" />
            </UpdateParameters>
            <SelectParameters>
                <asp:Parameter DefaultValue="6100848b-ec9c-4504-9c07-5d5b16e65eb6" Name="GUID" Type="string" />
            </SelectParameters>
            <InsertParameters>
                <asp:Parameter Name="Taskno" Type="Int32" />
                <asp:Parameter Name="GUID" Type="Object" />
                <asp:Parameter Name="Attachedfiles" Type="String" />
            </InsertParameters>
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>
Avatar billede neoman Novice
19. juni 2007 - 16:48 #23
Ok her er mit bud så :
   

Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs)
        Dim myGridView As GridView
        Dim rowindex As Integer

        rowIndex = 2 ' fordi dit gridview sidder i 3. række i detailsview, og derfor har index 2

        myGridView = CType(DetailsView1.Rows(rowindex).FindControl("GridView1"), GridView)

    'e:rowIndex skulle så gerne være index for det row som du er i færd med at delete i GridView1
        Dim dd As Label = CType(GridView1.Rows(e.RowIndex).findcontrol("Labelfilename"), Label)
       
        Dim mitFilNavn as string
    mitFilNavn = dd.Text

    End Sub
Avatar billede wildthing Nybegynder
20. juni 2007 - 08:37 #24
Neoman> for en orden skyld skal der lige rettes på navnene (for at matche min test side)
Dim dd As Label = CType(myGridView.Rows(e.RowIndex).findcontrol("Label1"), Label)

Men... DET virker nu, og det gør det naturligvis så også på min rigtige side med denne kode
        Dim myGridView As GridView
        Dim rowindex As Integer

        rowindex = 9 ' fordi dit gridview sidder i 10. række i detailsview, og derfor har index 9

        myGridView = CType(DetailsView1.Rows(rowindex).FindControl("GridView2"), GridView)

        'e:rowIndex skulle så gerne være index for det row som du er i færd med at delete i GridView1
        Dim dd As Label = CType(myGridView.Rows(e.RowIndex).FindControl("Labelfilename"), Label)

        Dim mitFilNavn As String
        mitFilNavn = dd.Text

TAK for din tålmodighed og vilje. Jeg lærte en del af denne sag, og jeg er klar over at de 60 point kun er en ussel belønning, jeg vil forsøge at belønne dig næste gang jeg har en sag. Smid et svar:)
Avatar billede neoman Novice
20. juni 2007 - 09:43 #25
Det var da godt du fik det til at køre. Om jeg får 60 matadorkroner for det eller 60 000 000 af samme , er hip som hap:). Bare hjælp den næste som har et problem DU tilfældigvis kender løsningen på :)
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