博客 (22)

通常,XML文件不能直接和数据绑定控件进行绑定,可以利用DataSet的ReadXml()方法,将XML架构和数据读取到DataSet中,然后将DataSet作为数据源进行绑定。
下面代码是一个XML文件绑定的示例。
aspx文件

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    void Page_Load(object sender, System.EventArgs e)
    {
        //创建Dataset对象
        DataSet myDS = new DataSet();
        //将 XML 文件读入 Dataset
        myDS.ReadXml(Server.MapPath("people.xml"));
        //显示 Dataset 中表的名称
        Label1.Text = "表的名称是:" + myDS.Tables[0].TableName;
        //绑定到 DataGrid
        DataGrid1.DataSource = myDS.Tables[0];
        DataGrid1.DataBind();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>将 XML 文件作为数据源绑定到控件</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h3>将 XML 文件作为数据源绑定到控件</h3>
    <asp:Label ID="Label1" runat="server">Label</asp:Label><br />
    <asp:DataGrid ID="DataGrid1" runat="server"></asp:DataGrid>
    </div>
    </form>
</body>
</html>

people.xml文件<?xml version="1.0" encoding="utf-8" ?>
<People>
  <Persion>
    <Name>张三</Name>
    <Phone>433333333</Phone>
    <Address>北京</Address>
  </Persion>
  <Persion>
    <Name>李四</Name>
    <Phone>55555555555</Phone>
    <Address>杭州</Address>
  </Persion>
  <Persion>
    <Name>王五</Name>
    <Phone>666666</Phone>
    <Address>工工工</Address>
  </Persion>
</People>
5,237

许多情况下,asp.net 在 Page_Load 事件中需要动态生成控件,这对于一些新手,包括我在内,会因为回传控件消失,或重复叠加控件等原因搞得头大,经过我翻阅资料和自己的实践,以博客评论页为例,把整个框架写在下面,仅供参考。

<asp:Panel>
<asp:Panel 记录索引 3 >
<asp:Label 昵称 /> <asp:Label 时间 /> <asp:LinkButton 支持按钮_3 /> <asp:LinkButton 删除按钮_3 /> 1楼
</asp:Panel>
<asp:Panel 记录索引 5 >
<asp:Label 昵称 /> <asp:Label 时间 /> <asp:LinkButton 支持按钮_5 /> <asp:LinkButton 删除按钮_5 /> 2楼
</asp:Panel>
</asp:Panel>


记录索引是指数据库中的自动编号。

支持按钮触发事件 LinkButton_support_Click(object sender, EventArgs e)

删除按钮触发事件 LinkButton_del_Click(object sender, EventArgs e)

所有子 Panel 和内部的所有控件都是在 Page_Load 事件中动态创建的,并且不能被嵌套在 if(!IsPostBack)

“点支持累计点击数”和“点删除删除一条记录”都是需要操作数据库的,我以前的做法是操作完数据库后 .Clear() 掉所有控件,再重新生成一次,这样既浪费服务器资源,又容易出现界面上的混乱,譬如显示了两遍该文章的评论。

其实上面代码中 Panel 套 Panel 的好处就是可以根据索引直接删除相应控件,然后直接在页面呈现,而省去上述烦恼。至于累计支持数就更简单了,下面的代码可以轻松解决问题:

string n = ((Label)Panel_commentLists.FindControl("Label_against_" + id)).Text;
n
= (Convert.ToInt32(n) + 1).ToString();
((Label)Panel_commentLists.FindControl(
"Label_against_" + id)).Text = n;

如果有修改和添加评论操作,同样道理,不要重复地全部 .Controls.Add 一次。为了添加时追加一个子 Panel 方便,建议在 Page_Load 的地方传参使用方法来做。

 

补充:在现在的开发中,我更喜欢用动态生成TableRow,TableCell来操作。

xoyozo 17 年前
4,305