【问题标题】:Cannot find hidden input control on row data bound event在行数据绑定事件上找不到隐藏的输入控件
【发布时间】:2019-12-26 07:41:40
【问题描述】:

这是我的 aspx 文件内容。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload">
    <ContentTemplate>
        <table>
            <tr>
                <td>
                    <input id="hdnAID" type="hidden" runat="server" />
                    <asp:GridView ID="GridView1" runat="server" OnRowCancelingEdit="GridView1_RowCancelingEdit"
                        OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" OnRowDataBound="GridView1_RowDataBound" OnDataBound="GridView1_DataBound"
                        DataKeyNames="GeneralSettingID" EnableViewState="true">
                        <Columns>
                            <asp:TemplateField>
                                <ItemTemplate>
                                    <GridEditPopupMenu:GridEditPopupMenu ID="GridEditPopupMenu1" runat="server" currenttemplate="ItemTemplate" ShowDeleteLink="0" />
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <GridEditPopupMenu:GridEditPopupMenu ID="GridEditPopupMenu1" runat="server" currenttemplate="EditItemTemplate" />
                                </EditItemTemplate>
                            </asp:TemplateField>
                            <asp:BoundField DataField="GeneralSettingID" HeaderText="SettingNo" ReadOnly="true" />

                            <asp:TemplateField HeaderText="SettingName">
                                <ItemTemplate>
                                    <asp:Label ID="Label25" runat="server" Text='<%# Eval("GeneralSettingName") %>' />
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtUpdateGeneralSettingName" onfocus="this.blur();" runat="server" Text='<%# Bind("GeneralSettingName") %>'
                                        Width="350px" />
                                </EditItemTemplate>
                            </asp:TemplateField>

                            <asp:TemplateField HeaderText="Values">
                                <ItemTemplate>
                                    <asp:Label ID="Label23" runat="server" Text='<%# Eval("GeneralSettingValue") %>' />
                                </ItemTemplate>
                                <EditItemTemplate>
                                    <asp:TextBox ID="txtUpdateGeneralSettingValue" runat="server" Text='<%# Bind("GeneralSettingValue") %>'
                                        Width="600px" TextMode="MultiLine" Rows="6" />
                                </EditItemTemplate>
                            </asp:TemplateField>    

                             <asp:TemplateField HeaderText="Company1">
                                <ItemTemplate>
                                    <asp:Label ID="Label28" runat="server" Text='<%# Eval("GeneralSettingCompany") %>' />
                                </ItemTemplate>
                                <ItemTemplate>
                                    <asp:TextBox ID="txtUpdateGeneralSettingCompany" runat="server" Text='<%# Bind("GeneralSettingCompany") %>'
                                        Width="100px" TextMode="MultiLine" Rows="1" Enabled="false" />
                                </ItemTemplate>
                            </asp:TemplateField> 

                            <asp:TemplateField HeaderText="Company2">                                     
                                 <ItemTemplate>                                         
                                    <asp:DropDownList  ID="drpCompanyList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="drpCompanyList_SelectedIndexChanged" DataTextField="CompanyName" DataValueField="CompanyID"></asp:DropDownList>
                                    <input id="hdnCompanyId" type="hidden" value='<%# Eval("GeneralSettingCompany") %>' runat="server" />
                                </ItemTemplate>                                                                                                                  
                            </asp:TemplateField>                                
                        </Columns>
                    </asp:GridView>
                </td>
            </tr>
        </table>
    </ContentTemplate>
</asp:UpdatePanel>

这里是 .cs 部分。

private LMSDataAccess.LookupsDataContext LkpDC = new LMSDataAccess.LookupsDataContext(ConfigFile.DBConnStr);
private System.Collections.Generic.List<LMSDataAccess.GeneralSetting> GeneralSettingList = null;


protected void Page_Load(object sender, EventArgs e)
{
    base.ModuleID = 27;

    if (!IsPostBack)
    {
        if (Request["AID"] != null)
            hdnAID.Value = Request["AID"];

        BindData();
    }
}

private void BindData()
{
    GeneralSettingList = LkpDC.GeneralSettingsGetAll(Common.NVLInt(hdnAID.Value),null).ToList();
    GridView1.DataSource = GeneralSettingList;
    GridView1.DataBind();
}

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    GridView1.EditIndex = -1;
    BindData();
}
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.EditIndex = e.NewEditIndex;
    BindData();
}
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    TextBox txtUpdateGeneralSettingName = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtUpdateGeneralSettingName");
    TextBox txtUpdateGeneralSettingValue = (TextBox)GridView1.Rows[e.RowIndex].FindControl("txtUpdateGeneralSettingValue");
    var hdnCompany = (HiddenField)GridView1.Rows[e.RowIndex].FindControl("hdnCompanyId") as HiddenField;

    string KeyValue = GridView1.DataKeys[e.RowIndex].Value.ToString();

    LkpDC.GeneralSettingsUpdate(Convert.ToInt32(KeyValue),
        txtUpdateGeneralSettingName.Text,
        txtUpdateGeneralSettingValue.Text, 
        Convert.ToInt32(hdnCompany.Value));

    GridView1.EditIndex = -1;
    BindData();
    ResultCode = 0;
}

protected List<LMSDataAccess.Company> GetAllCompanies()
{
    System.Collections.Generic.List<LMSDataAccess.Company> CompanyList = null;
    LMSDataAccess.OrganizationDataContext OrgDC = new LMSDataAccess.OrganizationDataContext(ConfigFile.DBConnStr);

    CompanyList = OrgDC.CompaniesGetAll(null).ToList();
    return CompanyList;
}
protected void drpCompanyList_SelectedIndexChanged(object sender, EventArgs e)
{

    DropDownList ddl = (DropDownList)sender;        
    GridViewRow row = (GridViewRow)ddl.Parent.Parent;
    var hdnCompany = row.FindControl("hdnCompanyId") as HiddenField;
    hdnCompany.Value = ddl.SelectedValue;        
}
protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e) 
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var ddl = e.Row.FindControl("drpCompanyList") as DropDownList;
        //here is the problem.
        var hdn = e.Row.FindControl("hdnCompanyId") as HiddenField;

        if (ddl != null)
        {
            ddl.DataSource = GetAllCompanies();
            ddl.DataValueField = "CompanyID";
            ddl.DataTextField = "CompanyName";
            ddl.DataBind();

        }
    }
}

当 GridView1_RowDataBound 和 drpCompanyList_SelectedIndexChangedfired 时,我心爱的问题是无法获取 hdnCompanyId 元素。我总是得到空值。(如注释行所示)

我尝试过像e.Row.FindControl("hdnCompanyId")这样的GridView1_RowDataBound事件方法 但它没有用。 我的最终目标是设置和获取此元素来控制我的下拉列表中的选定项目。

我认为代码写得很好,但我想我遗漏了一些关于用户控件元素层次结构的东西。 你能帮我看看我缺少什么吗?

【问题讨论】:

    标签: c# gridview webforms


    【解决方案1】:

    我发现问题是选择了错误的输入类型。它必须是HtmlInputHidden而不是HiddenField。我希望有人能从这个问题中得到有用的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多