1

问题:添加复选框或其他非标签 ItemTemplate 字段会导致 FindControl 方法返回空值。

正常行为:通常,当用户单击编辑时,EditItemTemplate 字段变为可用,我可以使用 FindControl 方法获取控件。简单吧?

protected void grdOppProducts_RowDataBound(object sender, GridViewRowEventArgs e) {

    if (e.Row.RowType == DataControlRowType.DataRow) {
        if (e.Row.RowState == DataControlRowState.Edit) {
            //only enters edit mode where checkbox control isn't available
            TextBox txtQuantity = (TextBox)e.Row.FindControl("txtQuantity");
        }
        ...

原因:现在,当将复选框 ItemTemplate 字段添加到组合中时,gridView rowState 永远不会达到编辑模式,因此 EditItemTemplate 控件永远不可用,从而导致空值。

gridView 控件定义如下(checkBox 字段 cbxSelect 导致问题)

<asp:GridView runat="server" id="oppProdgrdView" gridlines="None" AllowPaging="False" selectedrowstyle LightCyan="backcolor"
    autogeneratecolumns="false" 
    autoGenerateEditButton="false" 
    autoGenerateDeleteButton="true"
    OnRowDataBound="grdOppProducts_RowDataBound"
    OnRowCommand="grdOppProducts_RowCommand"
    OnRowUpdating="grdOppProducts_RowUpdating" 
    OnRowUpdated="grdOppProducts_RowUpdated"
    OnRowCancelingEdit="grdOppProducts_RowCancelingEdit"
    OnRowEditing="grdOppProducts_RowEditing" 
    OnRowDeleting="grdOppProducts_RowDeleting"
    cellpadding="1" cssclass="datagrid" pagerstyle-cssclass="gridPager"
alternatingrowstyle-cssclass="rowdk" rowstyle-cssclass="rowlt" selectedrowstyle-cssclass="rowSelected" showemptytable="True" enableviewstate="false"
emptytablerowtext="<%$ resources:dgOppProducts.EmptyTableRowText %>" expandablerows="True" resizablecolumns="True" currentsortdirection="Ascending" currentsortexpression="" 
datasourceid="SqlDataSource2" datakeynames="OPPPRODUCTID" showsorticon="False" useslxpagertemplate="True" AllowSorting="true" PageSize="16">

   <Columns>
       <asp:commandfield showeditbutton="true" causesvalidation="false" headertext=""/>

       <asp:BoundField DataField="OPPPRODUCTID" ItemStyle-CssClass="hidden-column" HeaderStyle-CssClass="hidden-column"
          HeaderText="OppProductId">
       </asp:BoundField>

       <asp:BoundField DataField="PRODUCTID" ItemStyle-CssClass="hidden-column" HeaderStyle-CssClass="hidden-column"
          HeaderText="ProductId">
       </asp:BoundField>

       <asp:TemplateField HeaderStyle-HorizontalAlign="Left"> 
            <ItemTemplate>
                <asp:CheckBox ID="cbxSelect" style="width: 10px;" runat="server" AutoPostBack="false" onClick="getCheckBoxValue($(this));" />
            </ItemTemplate>
       </asp:TemplateField>**

       <asp:TemplateField HeaderText="Line #" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtSort" style="width: 25px;" runat="server" AutoPostBack="false" Text='<%# Bind("SORT") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblSort" runat="server" Text='<%# Bind("SORT") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

       <asp:TemplateField HeaderText="Description" HeaderStyle-HorizontalAlign="Left"> 
           <ItemTemplate> 
            <asp:Label ID="lblName" runat="server" Text='<%# Bind("PRODUCTNAME") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

       <asp:TemplateField HeaderText="Version">
           <ItemTemplate>
                <asp:Label Text='<%# ACDGetVersion(Eval("PRODUCTID").ToString())%>'
                    runat="server" />
           </ItemTemplate>
       </asp:TemplateField>

       <asp:TemplateField HeaderText="Prorate">
           <EditItemTemplate> 
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
           </EditItemTemplate> 
           <EditItemTemplate>
                <asp:TextBox ID="txtPeriodAdjustment" style="width: 25px;" autopostback="false" Text='<%#ACDGetPeriodAdjustment(Eval("OPPPRODUCTID").ToString()) %>'
                    runat="server" />
           </EditItemTemplate>
           <ItemTemplate>
                <asp:Label ID="txtPer2" Text='<%#ACDGetPeriodAdjustment(Eval("OPPPRODUCTID").ToString()) %>'
                    runat="server" />
           </ItemTemplate>
       </asp:TemplateField>

       <asp:TemplateField HeaderText="Qty" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtQuantity" style="width: 25px;" runat="server" autopostback="false" Text='<%# Bind("QUANTITY") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblQuantity" runat="server" Text='<%# Bind("QUANTITY") %>'></asp:Label> 
           </ItemTemplate>
       </asp:TemplateField>

        <asp:TemplateField HeaderText="LicType" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtUnit" style="width: 100px;" runat="server" AutoPostBack="false" Text='<%# Bind("UNIT") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblUnit" runat="server" Text='<%# Bind("UNIT") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="UnitList" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtUnitListPrice" style="width: 80px;" runat="server" autopostback="false" Text='<%# Bind("UNITLISTPRICE") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblUnitListPrice" runat="server" Text='<%# Bind("UNITLISTPRICE") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="ExtList" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtExtendedListPrice" style="width: 80px;" runat="server" autopostback="false" Text='<%# Bind("EXTENDEDLISTPRICE") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblExtendedListPrice" runat="server" Text='<%# Bind("EXTENDEDLISTPRICE") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="AcadDisc" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtExtendedAcademicDiscAmt" style="width: 50px;" runat="server" ReadOnly="true" autopostback="false" Text='<%# Bind("EXTENDEDACADEMICDISCAMT") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblExtendedAcademicDiscAmt" runat="server" Text='<%# Bind("EXTENDEDACADEMICDISCAMT") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="%AddlDisc" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtApproxDiscretionDiscPct" style="width: 30px;" runat="server" readonly="true" autopostback="false" Text='<%# Bind("APPROXDISCRETIONDISCPCT") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblApproxDiscretionDiscPct" runat="server" Text='<%# Bind("APPROXDISCRETIONDISCPCT") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="AddlDisc" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtExtendedDiscretionDiscAmt"  style="width: 50px;" runat="server" autopostback="false" Text='<%# Bind("EXTENDEDDISCRETIONDISCAMT") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblExtendedDiscretionDiscAmt" runat="server" Text='<%# Bind("EXTENDEDDISCRETIONDISCAMT") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="UnitNet" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:TextBox ID="txtUnitNetPrice"  style="width: 70px;" runat="server" ReadOnly="true" Text='<%# Bind("UNITNETPRICE") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="Label1" runat="server" Text='<%# Bind("UNITNETPRICE") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="ExtNet" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate>  
            <asp:TextBox ID="txtExtendedNetPrice" style="width: 70px;" runat="server" ReadOnly="true" Text='<%# Bind("EXTENDEDNETPRICE") %>'></asp:TextBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="lblExtendedNetPrice" runat="server" Text='<%# Bind("EXTENDEDNETPRICE") %>'></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

   </Columns>

注意如果我创建带有标签作为 itemTemplate 的字段,这有效,但我需要能够选择多个复选框而不切换到编辑模式:

       <asp:TemplateField HeaderText="Line test" HeaderStyle-HorizontalAlign="Left"> 
           <EditItemTemplate> 
            <asp:CheckBox ID="TextBox2" style="width: 25px;" runat="server" AutoPostBack="false"></asp:CheckBox> 
           </EditItemTemplate> 
           <ItemTemplate> 
            <asp:Label ID="Label2" style="width: 25px;" runat="server" Text="test"></asp:Label> 
           </ItemTemplate>
        </asp:TemplateField>

有任何想法吗?提前致谢!

4

0 回答 0