Я хочу использовать вложенное gridview. Но моя родительская сетка не показывает Nothing
в переменной ChildGrid.
Любая помощь? Я пробовал следующие способы:
1)
Dim gvChild As GridView = CType (Me.gvwSubjectForProject.FindControl("gvChildGrid"), GridView)
2)
Dim gvChild As GridView = Me.gvwSubjectForProject.FindControl("gvChildGrid") gvChild.DataSource = dt_Subject gvChild.DataBind()
Я хочу найти идентификатор дочерней решетки, а затем хочу присвоить ему источник данных.
Частная функция FillGrid (режим ByVal As String, ByVal dt_Subject As DataTable) В качестве логического "Dim dt_Subject As DataTable = Nothing" Dim dt_sortsubject As DataTable = Nothing Try
If (mode = "ParentGrid") Then Me.gvwSubjectForProject.DataSource = Nothing Me.gvwSubjectForProject.DataBind() 'Me.ViewState(VS_CurrentSubject) = Nothing Me.btnExport.Visible = False 'dt_Subject.Columns.Add("Status", GetType(String)) If Not dt_Subject Is Nothing Then If dt_Subject.Rows.Count > 0 Then If dt_Subject.Rows.Count > 0 Then For Each dr_Row In dt_Subject.Rows If dr_Row("cStatus") = "AC" Then dr_Row("Status") = "Active" ElseIf dr_Row("cStatus") = "IA" Then dr_Row("Status") = "In Active" ElseIf dr_Row("cStatus") = "HO" Then dr_Row("Status") = "Hold" ElseIf dr_Row("cStatus") = "SC" Then dr_Row("Status") = "Screened" ElseIf dr_Row("cStatus") = "BO" Then dr_Row("Status") = "Booked" ElseIf dr_Row("cStatus") = "OS" Then dr_Row("Status") = "On Study" ElseIf dr_Row("cStatus") = "FI" Then dr_Row("Status") = "Forever Ineligible" Else dr_Row("cStatus") = "Not Found" End If Next Me.btnExport.Visible = True 'Me.ViewState(VS_CurrentSubject) = dt_Subject Me.gvwSubjectForProject.DataSource = dt_Subject Me.gvwSubjectForProject.DataBind() End If End If End If ElseIf (mode = "ChildGrid") Then If Not dt_Subject Is Nothing Then If dt_Subject.Rows.Count > 0 Then 'Me.gvwSubjectForProject.DataSource = dt_Subject 'Me.gvwSubjectForProject.DataBind() 'Me.gvwSubjectForProject.FindControl("gvChildGrid").DataSource =
dt_Subject
'CType(Me.gvwSubjectForProject.FindControl("gvChildGrid"),
GridView).DataBind() 'Me.gvwSubjectForProject.FindControl("gvChildGrid"). "Me.gvwSubjectForProject.FindControl( "gvChildGrid"). DataBind()
Dim gvChild As GridView = Me.gvwSubjectForProject.FindControl("gvChildGrid") gvChild.DataSource = dt_Subject gvChild.DataBind() End If End If End If Return True Catch ex As Exception Me.ShowErrorMessage("Error While Binding Grid", "....FillGrid") Return False End Try End Function
<asp:Panel ID="pnlgvwSubjectStatus" runat="server" Style="max-height: 500px; overflow: auto;
width: 60%;">
<asp:GridView ID="gvwSubjectForProject" runat="server" AutoGenerateColumns="false"
SkinID="grdViewSmlAutoSize" Width="70%" ShowFooter="true" AllowPaging="true"
PageSize="1">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="imgbtnExpand" runat="server" ImageUrl="../images/Plus.gif" alt="Expand"
OnClientClick="imgbtnExpand_Click" />
<asp:HiddenField ID="hcStatus" runat="server" Value='<%# Eval("cStatus") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Status" HeaderText="STATUS">
<ItemStyle HorizontalAlign="Left" VerticalAlign="Middle" Wrap="true" Width="40%" />
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="true" Width="40%" />
</asp:BoundField>
<asp:TemplateField>
<ItemTemplate>
<div style="max-height: 300px; width: 100%; overflow: auto;
text-align: right;">
<%--<asp:Panel ID="pnlOrders" runat="server" Width="100%">--%>
<asp:GridView ID="gvChildGrid" runat="server" AutoGenerateColumns="false" SkinID="grdViewSmlAutoSize">
<Columns>
<asp:BoundField ItemStyle-Width="40%" DataField="vSubjectID" HeaderText="SUBJECT ID">
<ItemStyle HorizontalAlign="Left" VerticalAlign="Middle" Wrap="true" Width="40%" />
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="true" Width="40%" />
</asp:BoundField>
<asp:BoundField ItemStyle-Width="60%" DataField="FullName" HeaderText="FULL NAME">
<ItemStyle HorizontalAlign="Left" VerticalAlign="Middle" Wrap="true" Width="60%" />
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="true" Width="60%" />
</asp:BoundField>
</Columns>
</asp:GridView>
<%--</asp:Panel>--%>
</div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="TotalSubject" HeaderText="TOTAL SUBJECTS">
<ItemStyle HorizontalAlign="Left" VerticalAlign="Middle" Wrap="true" Width="50%" />
<HeaderStyle HorizontalAlign="Center" VerticalAlign="Middle" Wrap="true" Width="50%" />
</asp:BoundField>
</Columns>
</asp:GridView>
</asp:Panel>
И еще одно, в HTML, когда дочернее gridview не отображается, его все еще заполняется при создании DOM. Я также хочу удалить это пустое пространство.
Ваш опубликованный код не работает, потому что вы используете метод FindControl()
во всех элементах управления родительской сеткой, а не в отдельной строке в элементе управления сеткой, например:
Найти детскую сетку в событии OnRowDataBound
:
Sub ParentGridView_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
' Only look for child grid view in data rows, ignore header and footer rows
If e.Row.RowType = DataControlRowType.DataRow Then
Dim theChildGridView As GridView = DirectCast(e.Row.FindControl("gvChildGrid"), GridView)
' Do something with theChildGridView here
End If
End Sub
Найти представление дочерней сетки путем циклического перехода по всем строкам в режиме управления сеткой родительского элемента:
For Each row As GridViewRow In ParentGridView.Rows
' Only look for child grid view in data rows, ignore header and footer rows
If row.RowType = DataControlRowType.DataRow Then
Dim theChildGridView As GridView = DirectCast(row.FindControl("gvChildGrid"), GridView)
' Do something with theChildGridView here
End If
Next
FindControl()
весь свой код для метода события, в котором вы выполняете эти попыткиFindControl()
внутри. Кроме того, не могли бы вы опубликовать разметку для вложенных элементов управления видом сетки?