• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

.NET 三层datalist嵌套,如何给最内层的datalist绑定数据?

Astolfou 2021-07-06 14:31:28

前台如下:

<body>
    <form id="form1" runat="server">
        <div>
        </div>
        <asp:DataList ID="dlImage" runat="server" OnItemDataBound="dlImageDataBound" RepeatColumns="5" RepeatDirection="Horizontal">
            <ItemTemplate>
                <div style="border:lpx solid black">
                    <br />
                    <asp:DataList ID="dlRelationship" runat="server" Height="126px" Width="189px">
                        <ItemTemplate>
                            <asp:Label ID="lbIT_TID" runat="server"  Visible="false" Text='<%# Eval("IT_TID") %>' />
                            <asp:DataList ID="dlTags" runat="server" RepeatColumns="5" RepeatDirection="Horizontal" Height="93px" Width="237px">
                                <ItemTemplate>
                                    <span><%# Eval ("T_Name") %>
                                </ItemTemplate>
                            </asp:DataList>
                        </ItemTemplate>
                    </asp:DataList>
                    <asp:Image ID="Image1" runat="server" Height="172px" ImageUrl='<%# Eval("I_Data") %>' Width="182px" />
                    <br /><asp:Label ID="lbImageID" runat="server"  Visible="false" Text='<%# Eval("I_ID") %>' />描述:<span><%# Eval ("I_Description") %><br />作者:<span><%# Eval ("I_Creator") %><br />创作日期:<span><%# Eval ("I_CreativeDate") %><br />类型:<span><%# Eval ("I_Kind") %><br /><br /></div>
            </ItemTemplate>
        </asp:DataList>
    </form>
</body>

后台如下:

private void BindList()
    {
        dlImage.DataSource = imagesSrv.GetImages();
        dlImage.DataBind();
    }
    protected void dlImageDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataList dl = null;
            Label labImageID = null;
            dl = (DataList)e.Item.FindControl("dlRelationship");
            dl.ItemDataBound += new System.Web.UI.WebControls.DataListItemEventHandler(dlRelationship_ItemDataBound);
            labImageID = (Label)e.Item.FindControl("lbImageID");
            string imageID = labImageID.Text.ToString();
            int iImageID = Convert.ToInt32(imageID);
            string commandText = "select * from IT";
            commandText = commandText + " Where IT_IID=" + iImageID;
            string connString = ConfigurationManager.ConnectionStrings["MyImageDataConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = connString;
            conn.Open();
            SqlDataAdapter myCommand = new SqlDataAdapter(commandText, conn);
            DataSet ds = new DataSet();
            myCommand.Fill(ds, "IT");
            conn.Close();
            dl.DataSource = ds.Tables["IT"]; 
            dl.DataBind();
        }
    }    
    protected void dlRelationship_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataList dl = null;
            Label labTagsID = null;
            dl = (DataList)e.Item.FindControl("dlTags");
            labTagsID = (Label)e.Item.FindControl("lbIT_TID");
            string tagsID = labTagsID.Text.ToString();
            int iTagsID = Convert.ToInt32(tagsID);
            string commandText = "select * from IT";
            commandText = commandText + " Where IT_TID=" + iTagsID;
            string connString = ConfigurationManager.ConnectionStrings["MyImageDataConnectionString"].ConnectionString;
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = connString;
            conn.Open();
            SqlDataAdapter myCommand = new SqlDataAdapter(commandText, conn);
            DataSet ds = new DataSet();
            myCommand.Fill(ds, "Tags");
            conn.Close();
            dl.DataSource = ds.Tables["Tags"]; ;
            dl.DataBind();
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindList();
        }
    }

自己做了三个表,图片表存储图片信息;标签表存储标签id和标签名;图片-标签表用来存储对应关系。

        经过测试,通过外层datalist的ItemDataBound可以为第二层的dlRelationship绑定数据,但是最内层的dlTags却会失效,网上查了下后用DataListItemEventHandler任然不行,跪求大佬帮助。

...全文
710 点赞 收藏 9
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复

每个DataList 都有ItemDataBound事件吧。分别在事件里去绑定哈

回复
低丶调 07-07

ItemDataBound这个事件是每一条数据都会进来一次?如果图片有100个,会进来一百次来查这个IT表,然后it表如果有n条数据有继续循环的查....我的天这个代码简直了......

我的建议是里把这些数据最后放到一个对象里面(不要循环的访问db,这性能太差了)
类大致是这些字段
1.图片相关的属性(页面要绑定的那些)
2.对应的Tag的list

也就不用搞这么多dataList控件了,直接
dl.DataSource = 上面已经搞好的list;
dl.DataBind();

回复 1
Astolfou 07-07
@低丶调 谢谢大佬指导
回复
低丶调 07-06

我把你的代码跑了一下,最后的那个事件断点能进去的,你先把前端代码调整一下,然后再看吧

img

回复
Astolfou 07-06
@低丶调 多谢大佬指教,但是把这些控件拖到第三层datalist中,要怎么给这三层绑定数据啊。。。一个datalist不是只能绑定一个数据表吗?标签和其他控件要调用的数据不在一张表里啊= =
回复
低丶调 07-06

--下面的前端代码是指什么?

img

这些数据绑定都是在 dlTags里面,需要移到他的templete里

回复
低丶调 07-06

而且你下面的这些前端代码,需要放到dlTags里面吧?你看一下你的标签层级

回复
低丶调 07-06

哇,2021了还有在用webForm的,哈哈
断点能进到 dl.DataSource = ds.Tables["Tags"]; 这一行吗?你看一下这个里面有没有数据

回复 1
Astolfou 07-06
@低丶调 断点进不去,二层datalist的ItemDataBound函数没法启用。 下面的前端代码是指什么?我的三层datalist只负责显示指定标签名
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2021-07-06 14:31
社区公告
暂无公告