datalist嵌套datalist实现内层datalist编辑(更新、取消、删除)

围观一下思路:

〈1〉先绑定d1和d2(d1外层d2是内层)

       1>在page_load中加载d1的绑定数据

       2>在d1_ItemDataBound中根据d1的数据对应绑定d2数据

           A.先找出d2控件:e.Item.FindControl("d2")

           B.找到外层的数据项DataRowView drv = (DataRowView)e.Item.DataItem;然后找到外层主键object id = drv["id"];          

           C.根据外层主键绑定内层数据

〈2〉外层编辑、取消、更新就不具体说了:d1_EditCommand、d1_CancelCommand、d1_UpdateCommand

〈3〉在内层d2_ItemCommand事件中实现内层控件d2的编辑、取消、更新、删除

       1>得到内层控件id->d2:(DataList)e.Item.Parent;

       2>得到内层正要编辑的主键id即small_id:(HiddenField)e.Item.FindControl("h2")).Value;

       3>根据内层主键id得到外层主键id即big_id:select big_id from table2 where small_id=....

       4>实现编辑、更新、取消、删除(根据e.CommandName == ...进行判断)

数据库两个表:

大文件表:

小文件表:

前台代码:

<asp:DataList ID="d1" runat="server" OnItemDataBound="d1_ItemDataBound" OnEditCommand="d1_EditCommand"

        OnCancelCommand="d1_CancelCommand" OnUpdateCommand="d1_UpdateCommand">

        <ItemTemplate>

            <asp:HiddenField ID="h1" Value='<%# Eval("id") %>' runat="server" />

            <span style="font-size: large; color: Red">

                <%# Eval("big_sFile") %></span><asp:Button ID="b1" runat="server" Text="编辑" CommandName="edit" /><br />

            <asp:DataList ID="d2" runat="server" OnItemCommand="d2_ItemCommand">

                <ItemTemplate>

                    <asp:HiddenField ID="h2" Value='<%# Eval("id") %>' runat="server" />

                    <%# Eval("small_sFile") %><asp:Button ID="b2" runat="server" Text="编辑" CommandName="Edit" />

                </ItemTemplate>

                <EditItemTemplate>

                    <asp:HiddenField ID="h2" Value='<%# Eval("id") %>' runat="server" />

                    <asp:TextBox ID="t2" Text='<%# Eval("small_sFile") %>' runat="server"></asp:TextBox><asp:Button

                        ID="bupdate" runat="server" CommandName="Update" Text="更新" /><asp:Button ID="bcanel"

                            runat="server" Text="取消" CommandName="Cancel" />

                </EditItemTemplate>

            </asp:DataList>

        </ItemTemplate>

        <EditItemTemplate>

            <asp:HiddenField ID="h1" Value='<%# Eval("id") %>' runat="server" />

            <asp:TextBox ID="t1" Text='<%# Eval("big_sFile") %>' runat="server"></asp:TextBox><asp:Button

                ID="bupdate" runat="server" CommandName="Update" Text="更新" /><asp:Button ID="bcanel"

                    runat="server" Text="取消" CommandName="Cancel" />

        </EditItemTemplate>

    </asp:DataList>

 后台.cs代码

DataAccess d = new DataAccess();

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            bind();

        }

    }

    public void bind()

    {

        d1.DataSource = d.getDataSet("select * from tb_big_img", false);

        d1.DataBind();

    }

    protected void d1_ItemDataBound(object sender, DataListItemEventArgs e)

    {

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

        {

            DataList list = (DataList)e.Item.FindControl("d2");

            DataRowView drv = (DataRowView)e.Item.DataItem;

            object id = drv["id"];

            if (id != null)

            {

                list.DataSource = d.getDataSet("select * from tb_small_img where bid='" + id.ToString() + "'", false);

                list.DataBind();

            }

        }

    }

    protected void d1_EditCommand(object source, DataListCommandEventArgs e)

    {

        d1.EditItemIndex = e.Item.ItemIndex;

        bind();

    }

    protected void d1_CancelCommand(object source, DataListCommandEventArgs e)

    {

        d1.EditItemIndex = -1;

        bind();

    }

    protected void d1_UpdateCommand(object source, DataListCommandEventArgs e)

    {

        string id = ((HiddenField)e.Item.FindControl("h1")).Value;

        string big_img = ((TextBox)e.Item.FindControl("t1")).Text;

        d.getCount("update tb_big_img set big_sFile='" + big_img + "' where id='" + id + "'", false);

        d1.EditItemIndex = -1;

        bind();

    }

    protected void d2_ItemCommand(object source, DataListCommandEventArgs e)

    {

        DataList d2 = (DataList)e.Item.Parent;//得到内层datalist的id即d2

        string small_id = ((HiddenField)e.Item.FindControl("h2")).Value;//得到内层正要编辑的id即small_id

        string big_id = d.getSingle("select bid from tb_small_img where id='" + small_id + "'", false).ToString();//根据内层id得到外层id即big_id

        if (e.CommandName == "Edit")

        {

            d2.EditItemIndex = e.Item.ItemIndex;

        }

        else if (e.CommandName == "Cancel")

        {

            d2.EditItemIndex = -1;

        }

        else if (e.CommandName == "Update")

        {

            string sFile = ((TextBox)e.Item.FindControl("t2")).Text;

            d.getCount("update tb_small_img set small_sFile='" + sFile + "' where id='" + small_id + "'", false);

            d2.EditItemIndex = -1;

        }

        d2.DataSource = d.getDataSet("select * from tb_small_img where bid='" + big_id + "'", false);

        d2.DataBind();

    }

 注意:有待思考:在内层d2_ItemCommand事件中如何直接获取外层对应行的主键

          想法:DataList d1 = (DataList)e.Item.Parent.Parent.Parent;????????

          请大家指正……

你可能感兴趣的:(datalist)