【发布时间】:2013-12-10 13:55:25
【问题描述】:
我有一个如下的 GridView
<asp:GridView ID="gvChain" runat="server" Font-Size="Small" CellPadding="3" CellSpacing="1" GridLines="None" AutoGenerateColumns="False">
<headerstyle backcolor="#CCCCCC" />
<columns>
<asp:BoundField DataField="Department" HeaderText="Department" />
<asp:TemplateField HeaderText="Manager Level 1">
<ItemTemplate>
<asp:Label ID="lblManager1" runat="server" Text=""></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="cbManager1" runat="server"/>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Manager Level 2">
<ItemTemplate>
<asp:Label ID="lblManager2" runat="server"/>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="cbManager2" runat="server"/>
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True">
<ControlStyle ForeColor="#009EDD" />
</asp:CommandField>
</columns>
</asp:GridView>
BoundField 'Department' 被填充到 Page_Load 中,如下所示,它工作正常并使用部门列表填充 GridView。
Dim dhandler As DepartmentHandler = New DepartmentHandler
Dim depts As New List(Of Department)
depts = dhandler.GetDepartmentList
gvChain.DataSource = depts
gvChain.DataBind()
然后我在 RowDAtaBound 事件中填充 TemplateFields 的 ItemTemplates,如下所示。这也很好用。
If e.Row.RowType = DataControlRowType.DataRow Then
Dim lblManager1 As Label = DirectCast(e.Row.FindControl("lblManager1"), Label)
Dim lblManager2 As Label = DirectCast(e.Row.FindControl("lblManager2"), Label)
Dim eHandler As EmployeeHandler = New EmployeeHandler
Dim deptCell As TableCell = e.Row.Cells(0)
Dim dept As Department = New Department
dept.Department = deptCell.Text
Dim mgr1 As Manager = eHandler.getManager1(dept)
Dim mgr2 As Manager = eHandler.getManager2(dept)
lblManager1.Text = mgr1.Name
lblManager2.Text = mgr2.Name
End If
我现在想要实现的是,当单击 GridView 上一行的“编辑”字段时,使用管理器列表填充 cbManager1 和 cbManager2,并将每个 DDL 的 SelectedValue 设置为与我检索时相同的值项目模板。我可以在 GridView 的 RowEditing 事件中使用以下代码获取数据:
' Get the list of managers
Dim mgrs As New List(Of Manager)
mgrs = eHandler.GetManagerList
' Get the department name from the BoundField
Dim deptCell As TableCell = gvChain.Rows(e.NewEditIndex).Cells(0)
Dim dept As Department = New Department
dept.Department = deptCell.Text
' Pass the department name to the getManager1/2 functions to return the correct manager for that department
Dim mgr1 As Manager = eHandler.getManager1(dept)
Dim mgr2 As Manager = eHandler.getManager2(dept)
我设置了断点来检查从函数返回的数据,并且数据按预期存在,但我卡住的地方是在 EditItemTemplate 中获取 DDL 的引用,以便我可以对它们进行数据绑定并设置 SelectedValue。
我尝试了以下方法,但这给出了 NullReference 异常:
Dim cbManager1 As DropDownList = TryCast(gvChain.Rows(e.NewEditIndex).FindControl("cbManager1"), DropDownList)
Dim cbManager2 As DropDownList = TryCast(gvChain.Rows(e.NewEditIndex).FindControl("cbManager2"), DropDownList)
【问题讨论】:
-
你在哪里尝试最后两个语句,我的意思是在哪个事件中?
-
对不起,他们在 RowEditing 事件中
-
@Jimsan - 你应该检查一下:DataBinding DropDownList inside GridView EditItemTemplate.