c# - 当同一 Gridview 中的下拉菜单上选定的索引发生更改时,在 Gridview 中绑定(bind)下拉菜单

标签 c# asp.net gridview drop-down-menu

我有一个带有模板字段的 GridView ,其中包含下拉列表和文本框。 1 下拉列表将是所谓的“主”下拉列表,当所选索引更改时,同一行中的其他下拉列表将使用主下拉列表的所选值进行数据绑定(bind)。

我的 ASPX 有此代码

<asp:GridView ID="gvEducations" runat="server" AutoGenerateColumns="false" 
        DataKeyNames="file2_id" onrowcancelingedit="gvEducations_RowCancelingEdit" 
        onrowdatabound="gvEducations_RowDataBound" 
        onrowdeleting="gvEducations_RowDeleting" onrowediting="gvEducations_RowEditing" 
        onrowupdating="gvEducations_RowUpdating">
        <Columns>
            <asp:BoundField HeaderText="file2_id" DataField="file2_id" ReadOnly="true" Visible="False"/>
            <asp:TemplateField HeaderText="Education Establishment">
                <ItemTemplate>
                    <%# Eval("education_establishment_code") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditEducationEstablishment" runat="server"
                        OnSelectedIndexChanged="ddlEditEducationEstablishment_SelectedIndexChanged">
                    </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="School">
                <ItemTemplate>
                    <%# Eval("school_code") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditSchool" runat="server"></asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="School Others" Visible="false">
                <ItemTemplate>
                    <%# Eval("school_others") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtEditSchoolOthers" runat="server" MaxLength="81"
                        Text='<%# Eval("school_others") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Start Date">
                <ItemTemplate>
                    <%# Convert.ToDateTime(Eval("start_date")).ToString("d")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtEditStartDate" runat="server" type="date"
                        Text='<%# Bind("start_date", "{0:yyyy-MM-dd}") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="End Date">
                <ItemTemplate>
                    <%# Convert.ToDateTime(Eval("end_date")).ToString("d")%>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtEditEndDate" runat="server" type="date"
                        Text='<%# Bind("end_date", "{0:yyyy-MM-dd}") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Branch Of Study 1">
                <ItemTemplate>
                    <%# Eval("branch_of_study_1_code") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditBranchOfStudy1" runat="server"></asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Certificate">
                <ItemTemplate>
                    <%# Eval("certificate_code") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditCertificate" runat="server"></asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Course Appraisal">
                <ItemTemplate>
                    <%# Eval("course_appraisal") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox ID="txtEditCourseAppraisal" runat="server" MaxLength="30"
                        Text='<%# Eval("course_appraisal") %>'></asp:TextBox>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Branch Of Study 2">
                <ItemTemplate>
                    <%# Eval("branch_of_study_2_code") %>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlEditBranchOfStudy2" runat="server"></asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Edit">
                <ItemTemplate>
                    <asp:Button ID="btnEdit" runat="server" Text="Edit" CommandName="Edit" UseSubmitBehavior="false"/>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Button ID="btnSave" runat="server" Text="Save" CommandName="Update" UseSubmitBehavior="false"/>
                    <asp:Button ID="btnCanel" runat="server" Text="Cancel" CommandName="Cancel" UseSubmitBehavior="false"/>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Delete">
                <ItemTemplate>
                    <asp:Button ID="btnDelete" runat="server" Text="Delete" CommandName="Delete" UseSubmitBehavior="false"/>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

隐藏代码(RowDataBound Gridview 事件)

protected void gvEducations_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow && gvEducations.EditIndex == e.Row.RowIndex)
        {
            int file2Id = int.Parse(gvEducations.DataKeys[e.Row.RowIndex].Value.ToString());
            DataTable dt = new DataTable();
            dt = file2BLO.SelectSpecificFile2(file2Id);
            DropDownList ddlEditEducationEstablishment =
                (DropDownList)e.Row.FindControl("ddlEditEducationEstablishment");
            ddlEditEducationEstablishment.DataSource =
                educationEstablishmentBLO.SelectAllEducationEstablishment();
            ddlEditEducationEstablishment.DataValueField = "education_establishment_code";
            ddlEditEducationEstablishment.DataTextField = "education_establishment";
            ddlEditEducationEstablishment.DataBind();
            ddlEditEducationEstablishment.SelectedValue =
                dt.Rows[0]["education_establishment_code"].ToString();
            string educationEstablishmentCode = ddlEditEducationEstablishment.SelectedValue;
            DropDownList ddlEditSchool = (DropDownList)e.Row.FindControl("ddlEditSchool");
            ddlEditSchool.DataSource =
                schoolBLO.SelectSchoolOfEstablishment(educationEstablishmentCode);
            ddlEditSchool.DataValueField = "school_code";
            ddlEditSchool.DataTextField = "school";
            ddlEditSchool.DataBind();
            ddlEditSchool.SelectedValue = dt.Rows[0]["school_code"].ToString();
            DropDownList ddlEditBranchOfStudy1 = (DropDownList)e.Row.FindControl
                ("ddlEditBranchOfStudy1");
            ddlEditBranchOfStudy1.DataSource = branchOfStudyBLO.
                SelectBranchOfEstablishment(educationEstablishmentCode);
            ddlEditBranchOfStudy1.DataValueField = "branch_of_study_code";
            ddlEditBranchOfStudy1.DataTextField = "branch_of_study";
            ddlEditBranchOfStudy1.DataBind();
            ddlEditBranchOfStudy1.SelectedValue = dt.Rows[0]["branch_of_study_1_code"].ToString();
            DropDownList ddlEditCertificate = (DropDownList)e.Row.FindControl
                ("ddlEditCertificate");
            ddlEditCertificate.DataSource = certificateBLO.
                SelectCertificateOfEstablishment(educationEstablishmentCode);
            ddlEditCertificate.DataValueField = "certificate_code";
            ddlEditCertificate.DataTextField = "certificate";
            ddlEditCertificate.DataBind();
            ddlEditCertificate.SelectedValue = dt.Rows[0]["certificate_code"].ToString();
            DropDownList ddlEditBranchOfStudy2 = (DropDownList)e.Row.
                FindControl("ddlEditBranchOfStudy2");
            ddlEditBranchOfStudy2.DataSource = branchOfStudyBLO.
                SelectBranchOfEstablishment(educationEstablishmentCode);
            ddlEditBranchOfStudy2.DataValueField = "branch_of_study_code";
            ddlEditBranchOfStudy2.DataTextField = "branch_of_study";
            ddlEditBranchOfStudy2.DataBind();
            ddlEditBranchOfStudy2.SelectedValue = dt.Rows[0]["branch_of_study_1_code"].ToString();
        }
    }

这是我尝试过的:

protected void ddlEditEducationEstablishment_SelectedIndexChanged(object sender, EventArgs e)
    {
        //if (e.Row.RowType == DataControlRowType.DataRow && gvEducations.EditIndex == e.Row.RowIndex)
        //{
        //    DropDownList ddlEditEducationEstablishment =
        //        (DropDownList)e.Row.FindControl("ddlEditEducationEstablishment");
        //    string educationEstablishmentCode = ddlEditEducationEstablishment.SelectedValue;
        //    DropDownList ddlEditSchool = (DropDownList)e.Row.FindControl("ddlEditSchool");
        //    ddlEditSchool.DataSource =
        //        schoolBLO.SelectSchoolOfEstablishment(educationEstablishmentCode);
        //    ddlEditSchool.DataValueField = "school_code";
        //    ddlEditSchool.DataTextField = "school";
        //    ddlEditSchool.DataBind();
        //    DropDownList ddlEditBranchOfStudy1 = (DropDownList)e.Row.FindControl
        //        ("ddlEditBranchOfStudy1");
        //    ddlEditBranchOfStudy1.DataSource = branchOfStudyBLO.
        //        SelectBranchOfEstablishment(educationEstablishmentCode);
        //    ddlEditBranchOfStudy1.DataValueField = "branch_of_study_code";
        //    ddlEditBranchOfStudy1.DataTextField = "branch_of_study";
        //    ddlEditBranchOfStudy1.DataBind();
        //    DropDownList ddlEditCertificate = (DropDownList)e.Row.FindControl
        //        ("ddlEditCertificate");
        //    ddlEditCertificate.DataSource = certificateBLO.
        //        SelectCertificateOfEstablishment(educationEstablishmentCode);
        //    ddlEditCertificate.DataValueField = "certificate_code";
        //    ddlEditCertificate.DataTextField = "certificate";
        //    ddlEditCertificate.DataBind();
        //    DropDownList ddlEditBranchOfStudy2 = (DropDownList)e.Row.
        //        FindControl("ddlEditBranchOfStudy2");
        //    ddlEditBranchOfStudy2.DataSource = branchOfStudyBLO.
        //        SelectBranchOfEstablishment(educationEstablishmentCode);
        //    ddlEditBranchOfStudy2.DataValueField = "branch_of_study_code";
        //    ddlEditBranchOfStudy2.DataTextField = "branch_of_study";
        //    ddlEditBranchOfStudy2.DataBind();
        //}
    }

我想要的是,当我在第一个下拉列表中选择时,其他下拉列表将使用第一个下拉列表中的选定值再次进行数据绑定(bind)。请参阅下图。 Sample

最佳答案

就像我在评论中所说,您需要找到 DropDownList 所在的 GridViewRow。通过该行,您可以找到所有其他 DropDownList。通过查找其他每个 DropDownList,您的方向是正确的,但您没有在正确的位置查找它们。

protected void ddlEditEducationEstablishment_SelectedIndexChanged(object sender, EventArgs e)
{
    // Get the master DropDownList and its value
    DropDownList ddlEditEducationEstablishment = (DropDownList)sender;
    string educationEstablishmentCode = ddlEditEducationEstablishment.SelectedValue;

    // Get the GridViewRow in which this master DropDownList exists
    GridViewRow row = (GridViewRow)ddlEditEducationEstablishment.NamingContainer;

    // Find all of the other DropDownLists within the same row and bind them
    DropDownList ddlEditSchool = (DropDownList)row.FindControl("ddlEditSchool");
    ddlEditSchool.DataSource = schoolBLO.SelectSchoolOfEstablishment(educationEstablishmentCode);
    ddlEditSchool.DataValueField = "school_code";
    ddlEditSchool.DataTextField = "school";
    ddlEditSchool.DataBind();

    // etc...
}

关于c# - 当同一 Gridview 中的下拉菜单上选定的索引发生更改时,在 Gridview 中绑定(bind)下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30591001/

相关文章:

c# - 使用 epplus 设置单元格宽度会影响整列

jquery - 如何申请定制 bundle 订单?

asp.net - 将 Office 365 集成到 Window Azure 应用程序?

c# - GridView 选定的行单元格值变为空

c# - 设置 Focusable=False 导致 TabItem 在 wpf 中不可选

c# - 知道什么 id 不存在

c# - 实例化一个实现通用接口(interface)的类

c# - 在 Asp.Net Mvc 的下拉列表中显示特定的枚举值

sorting - Yii2 添加相关属性进行排序

android - 如何获取gridview(或RecyclerGridview)的选定项目的所有最近位置