asp.net中GridView实现DropDownList级联动

前几天写过文章,介绍了如何在DetailsView控件里实现DropDownList的联动,有人问我如何在GridView中来实现呢,今天我简单介绍办法:


--------------------------------------------------------------------------------


首先还是为GridView控件增加两个模板列用来存放实现联动的DropDownList:

<asp:TemplateField HeaderText="乡">

<EditItemTemplate><asp:HiddenField ID="HDXiang" runat="server" Value='<%#Bind("地点_乡") %>' /><asp:DropDownList ID="DDXiangz" runat="server" Width="90px" AutoPostBack="true" OnSelectedIndexChanged="ddlXiang_SelectedIndexChanged2"/></EditItemTemplate>

<ItemTemplate>

<asp:Label ID="Label12" runat="server" Text='<%#Eval("地点_乡") %>'></asp:Label>

</ItemTemplate>

</asp:TemplateField>

   <asp:TemplateField HeaderText="村">

     <EditItemTemplate><asp:HiddenField ID="HDCun" runat="server" Value='<%#Bind("地点_村") %>' /><asp:DropDownList ID="DDlCunz" runat="server" Width="90px" /></EditItemTemplate>

<ItemTemplate>

<asp:Label ID="Label24" runat="server" Text='<%# Eval("地点_村")%>'></asp:Label>

    </ItemTemplate>

</asp:TemplateField>

小解:

我这里做的是乡和村的联动。在两个模板列的编辑模板下分别增加了HiddenField 控件,这里用来记录当前数据库中存放的乡和村的值记录,当用户单击编辑时通过它们来设置DropDownList 的默认选项。

乡的OnSelectedIndexChanged事件是来处理乡变化时村也随之联动,注,AutoPostBack需要设置为true.

OK, 再看下.cs文件里实现,这里主要涉及到两个事件OnSelectedIndexChanged事件和RowDataBound事件,一个一个看吧:

RowDataBound:

protected void GVData_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        commonData mycd = new commonData();

        if (((DropDownList)e.Row.FindControl("DDLxz")) != null)

        {

            //绑定乡

            DropDownList DDXiang = (DropDownList)e.Row.FindControl("DDXiangz");

            DDXiang.DataSource =您的乡数据源,从数据库读取;

            DDXiang.DataTextField = "乡名";

            DDXiang.DataValueField = "编号";

            DDXiang.DataBind();

            // 通过HiddenField选中现在的 DropDownList的值

           DDXiang.SelectedValue = ((HiddenField)e.Row.FindControl("HDXiang")).Value;

            //绑定村

            DropDownList DDCun = (DropDownList)e.Row.FindControl("DDlCunz");

            DDCun.DataSource = 您的村数据源,从数据库读取;

            DDCun.DataTextField = "村名";

            DDCun.DataValueField = "编号";

            DDCun.DataBind();

            // 通过HiddenField选中现在的 DropDownList的值

            DDCun.SelectedValue = ((HiddenField)e.Row.FindControl("HDCun")).Value;

        }


小解:

这个是针对我的GridView控件的RowDataBound事件来说的,当行数据绑定时进行动态绑定乡和村和DropDownList(从数据库中读取数据)。

OK,实现了乡和村的数据绑定后,我们看下它们的级联动问题(当单击编辑时,乡改变时动态获取与之对应的村的数据)

OnSelectedIndexChanged:

/// <summary>

    /// 编辑时村随着乡变化

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    public void ddlXiang_SelectedIndexChanged2(object sender, EventArgs e)

    {

        DropDownList DDXiang= (DropDownList)sender;//获取现在的事件触发者:乡的DropDownList

        GridViewRow gvr = (GridViewRow)DDXiang.NamingContainer;//乡与村同属于在一个NamingContainer下

        DropDownList DDCun = (DropDownList)gvr.FindControl("DDlCunz");//找到村的DropDownList

        DDCun.DataSource = getCommon_cun(DDXiang.SelectedValue).Tables[0].DefaultView;//这个函数是我自定义的,通过乡的编辑取得与之对应的村的数据集

        DDCun.DataTextField = "村名";

        DDCun.DataValueField = "编号";

        DDCun.DataBind();

    }

小解:

上述关键是找到当前要操作的乡的DropDownList和村的DropDownList,乡的DropDownList好找,可以通过sender获取,与之对应的村的DropDownList因为与乡的DropDownList同属于在一个NamingContainer下,所以也可以找到它,这样就可以通过乡的DropDownList编号对村的DropDownList实现数据绑定了。

关于NamingContainer我也写过文章介绍,详情请查看《asp.net中的NamingContainer详解》

posted on 2010-09-29 16:58  学知者  阅读(409)  评论(0编辑  收藏  举报