Вложенный GridView ряд событий Pandemonium - PullRequest
0 голосов
/ 07 декабря 2010

Я столкнулся со странным поведением, связанным с вложенными элементами управления gridview и событиями строк.По сути, событие вложенной строки gridview не сработает, если оно не находится в последней строке внешней сетки.

Если вы явно добавляете свойство события строки в разметку (например, OnRowDeleted = "gvInner_RowDeleted"), тогда событие строки запускается для всех вложенных видов сетки, однако оно запускает дважды для вложенного вида сетки впоследняя строка внешнего вида сетки

РЕДАКТИРОВАТЬ: Я должен отметить, что я использую SqlDataSource для внешнего вида сетки, так как он также редактируемый.Это не ясно в примере.

Разметка:

<asp:GridView ID="gvOuter" DataSourceID="sdsOuter" runat="server" OnRowDatabound="DynamicControlAdder" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Id" ReadOnly="true" />
        <asp:TemplateField>
            <ItemTemplate>        

                        <asp:UpdatePanel ID="upInner" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>                                
                                <asp:GridView ID="gvInner" DataSourceId="sdsInner" runat="server" DataKeyNames="Id"  AutoGenerateColumns="false">
                                    <Columns>
                                        <asp:CommandField ShowDeleteButton="true" />
                                        <asp:BoundField DataField="Id" />                                            
                                    </Columns>
                                </asp:GridView>
                                <asp:SqlDataSource ID="sdsInner" runat="server" 
                                    ProviderName="<%$ ConnectionStrings:YourString.ProviderName %>" 
                                    ConnectionString="<%$ ConnectionStrings:YourString %>"
                                    SelectCommand="SELECT * FROM tblInner WHERE OuterTableKey = @OuterTableKey"
                                    DeleteCommand="DELETE FROM tblInner WHERE Id = @Id">
                                    <SelectParameters>
                                        <asp:Parameter Name="OuterTableKey" DefaultValue="0" Type="Int32" />
                                    </SelectParameters>
                                    <DeleteParameters>
                                        <asp:Parameter Name="Id" DefaultValue="0" Type="Int32" />                                            
                                    </DeleteParameters>                                        
                                </asp:SqlDataSource>                                                 
                            </ContentTemplate>                
                        </asp:UpdatePanel>    

            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="sdsOuter" runat="server"
   ProviderName="<%$ ConnectionStrings:YourString.ProviderName %>" 
   ConnectionString="<%$ ConnectionStrings:YourString %>"
   SelectCommand="SELECT * FROM tblOuter">                                        
</asp:SqlDataSource>

Код:

Partial Class Testing
Inherits System.Web.UI.UserControl

Protected Sub DynamicControlAdder(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType <> DataControlRowType.DataRow Then
        Exit Sub
    End If

    Dim s As SqlDataSource = CType(e.Row.FindControl("sdsInner"), SqlDataSource)
    s.SelectParameters("OuterTableKey").DefaultValue = e.Row.DataItem("Id").ToString()

End Sub

Protected Sub gvInner_RowDeleted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeletedEventArgs) Handles gvInner.RowDeleted
    //'This never fires unless it is the last row in the outer gridview
    //'also, if this event is declared in the OnRowDeleted property of the inner gridview, this event fires twice if it is in the last row of the outer grid
    Dim strFoo As String = "Foo"
End Sub
End Class

МожетКто-нибудь воспроизводит это, и как вы обходите это?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2010

И ответ будет ......

Удалите предложение handles из события RowDeleted и установите для свойства OnRowDeleted событие gvInner_RowDeleted.

Обновлен код ниже.Я просто хотел бы, чтобы у меня были последние 4 часа моей жизни.

Наценка:

<asp:GridView ID="gvOuter" DataSourceID="sdsOuter" runat="server" OnRowDatabound="DynamicControlAdder" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Id" ReadOnly="true" />
        <asp:TemplateField>
            <ItemTemplate>        

                        <asp:UpdatePanel ID="upInner" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>                                
                                <asp:GridView ID="gvInner" DataSourceId="sdsInner" runat="server" DataKeyNames="Id" OnRowDeleted="gvInner_RowDeleted"  AutoGenerateColumns="false">
                                    <Columns>
                                        <asp:CommandField ShowDeleteButton="true" />
                                        <asp:BoundField DataField="Id" />                                            
                                    </Columns>
                                </asp:GridView>
                                <asp:SqlDataSource ID="sdsInner" runat="server" 
                                    ProviderName="<%$ ConnectionStrings:YourString.ProviderName %>" 
                                    ConnectionString="<%$ ConnectionStrings:YourString %>"
                                    SelectCommand="SELECT * FROM tblInner WHERE OuterTableKey = @OuterTableKey"
                                    DeleteCommand="DELETE FROM tblInner WHERE Id = @Id">
                                    <SelectParameters>
                                        <asp:Parameter Name="OuterTableKey" DefaultValue="0" Type="Int32" />
                                    </SelectParameters>
                                    <DeleteParameters>
                                        <asp:Parameter Name="Id" DefaultValue="0" Type="Int32" />                                            
                                    </DeleteParameters>                                        
                                </asp:SqlDataSource>                                                 
                            </ContentTemplate>                
                        </asp:UpdatePanel>    

            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="sdsOuter" runat="server"
   ProviderName="<%$ ConnectionStrings:YourString.ProviderName %>" 
   ConnectionString="<%$ ConnectionStrings:YourString %>"
   SelectCommand="SELECT * FROM tblOuter">                                        
</asp:SqlDataSource>

Код:

Partial Class Testing
Inherits System.Web.UI.UserControl

Protected Sub DynamicControlAdder(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

    If e.Row.RowType <> DataControlRowType.DataRow Then
        Exit Sub
    End If

    Dim s As SqlDataSource = CType(e.Row.FindControl("sdsInner"), SqlDataSource)
    s.SelectParameters("OuterTableKey").DefaultValue = e.Row.DataItem("Id").ToString()

End Sub

Protected Sub gvInner_RowDeleted(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeletedEventArgs) 
    //' Now we're talking
    Dim strFoo As String = "Foo"
End Sub
End Class
0 голосов
/ 07 декабря 2010

Я не думаю, что вы должны делать то, что делаете, так, как делаете.

Вот как я бы сделал то, что вы пытаетесь:

  1. Используйте повторитель для внешнего элемента управления с привязкой к данным, так как он рендерится более эффективно и будет иметь тот же эффект, которого вы пытаетесь достичь с помощью внешнего элемента управления gridview.
  2. В своем коде извлеките данные для своего внешнего вида сетки (который теперь является повторителем), загрузите их в таблицу данных и добавьте в набор данных, сделайте то же самое для данных во внутреннем виде сетки.
  3. Затем создайте связь между таблицами данных в наборе данных, используя DataSet.Relations.Add
  4. Как только вы создадите взаимосвязь между обоими таблицами данных в наборе данных, вы можете получить доступ к полям (столбцам) во второй таблице данных, которая будет использоваться для заполнения данных для вложенного (внутреннего) элемента управления gridview.

Разметка

<asp:Repeater ID="rpt1" runat="server">
    <ItemTemplate>
        <asp:GridView ID="gv1" runat="server" DataSource='<%# Container.DataItem.Row.GetChildRows("relation1") %>' GridLines="None" AutoGenerateColumns="false">
            <columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox ID="txt1" runat="server" Text='<%# Container.DataItem("<column>") %>'></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
            </columns>
        </asp:GridView>
    </ItemTemplate>
</asp:Repeater>

Код позади

Dim ds As New DataSet
Dim dt1 As DataTable = obj.<method> 'Outer data
Dim dt2 As DataTable = obj.<method> 'Inner data

ds.Tables.Add(dt1)
ds.Tables.Add(dt2)

ds.Relations.Add("relation1", ds.Tables(0).Columns("<unique identifier column name>"), ds.Tables(1).Columns("<unique id column name>"), False)

rpt1.DataSource = dt1
rpt1.DataBind()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...