当前位置:编程学习 > C#/ASP.NET >>

下午遇到Datalist的问题,希望坛友给个思路。

目的:控制datalist的显示数量,点击标题进入与id相对应的内容。
问题:以前默认首页都是显示一项,今天想让每页显示两条新闻,就把pds.Pagesize改为2,问题就出来了,插入断点,DataList1_ItemDataBound方法执行了两遍,第一遍Session["nid"]=1(这是对的),第二遍Session["nid"]=2,点nid=1的标题结果显示nid=2的新闻内容了。

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            bind();
        }
    }
    int pageCount;//总页数
    int currentPage = 1;//第定义当前页
    void bind()
    {
        string str = @"Data Source=.\sqlexpress;Initial Catalog=News;Integrated Security=True";
        SqlConnection conn = new SqlConnection(str);
        string sqlStr = "select * from News";
        SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn);
        DataSet ds = new DataSet();
        sda.Fill(ds, "nid");
        //DataSet ds = new DataSet();
        //ds = Business.NewsBusiness.GetNewsInfo("News");
        //创建数据源
        PagedDataSource pds = new PagedDataSource();
        pds.DataSource = ds.Tables["nid"].DefaultView;
        //允许分页
        pds.AllowPaging = true;
        //设置每页显示记录数
        pds.PageSize = 2;此处默认显示一条新闻,今天改成2,就出了问题。
        //获取总页数
        pageCount = pds.PageCount;
        this.Label1.Text = pageCount.ToString();
        pds.CurrentPageIndex = currentPage - 1;
        //当前页
        this.Label2.Text = Convert.ToString(currentPage);
        this.DataList1.DataSource = pds;
        this.DataList1.DataBind();
}
 protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {
            Entity.News n = new News();
            n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
            int r = Business.NewsBusiness.GetCommentAmount(n);
            Label lbl = (Label)e.Item.FindControl("lblInfo");
            if (lbl != null)
            {
                lbl.Text = r.ToString();
            }
            string r1 = Business.NewsBusiness.GetNewsUrl(n);
            ((LinkButton)(e.Item.FindControl("LinkButton1"))).PostBackUrl = r1;
            Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;设置为2,这个方法就执行了两遍吗?第一遍为1,第二遍就等于2.
    }
    protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {
        Entity.News n = new News();
        n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
        string r = Business.NewsBusiness.GetNewsUrl(n);
        if (e.CommandName == "detail")
        {
            ((LinkButton)(e.Item.FindControl("LinkButton1"))).PostBackUrl = r;
        }
        Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;
    }
datalist dataset --------------------编程问答-------------------- 人工置顶,求思路。 --------------------编程问答-------------------- 有两条数据,DataList1_ItemDataBound 就会两遍,每一遍绑定一条,不然怎么叫ItemDataBound,与之对应的,还有个DataBound事件,那个才是只整个DataList的绑定

代码有点乱
n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
……
Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;
这两句是你手敲上去的,练打字呢?这里不应该使用Session
直接将带nid参数的URL给到LinkButton就行了
--------------------编程问答-------------------- 你的 新闻内容 页是不是根据Session["nid"]显示的内容啊 --------------------编程问答--------------------
引用 2 楼 dongxinxi 的回复:
有两条数据,DataList1_ItemDataBound 就会两遍,每一遍绑定一条,不然怎么叫ItemDataBound,与之对应的,还有个DataBound事件,那个才是只整个DataList的绑定

代码有点乱
n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
……
Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;
这两句是你手敲上去的,练打字呢?这里不应该使用Session
直接将带nid参数的URL给到LinkButton就行了

我应该把ItemDataBound下的代码移动到DataBound下吗? --------------------编程问答--------------------
引用 3 楼 gclol 的回复:
你的 新闻内容 页是不是根据Session["nid"]显示的内容啊

对啊,但现在我一页显示两个,它就循环两遍,导致我点击nid为1的新闻标题,进nid=2的内容页面。 --------------------编程问答-------------------- 那就别在数据绑定的时候修改Session了,把修改Session的工作放到DataList1_ItemCommand里,然后直接跳转;或者通过url传参 --------------------编程问答-------------------- 还是根据url传参比较好,不要用session,不然你要打开多个新闻页怎么办? --------------------编程问答--------------------
引用 6 楼 gclol 的回复:
那就别在数据绑定的时候修改Session了,把修改Session的工作放到DataList1_ItemCommand里,然后直接跳转;或者通过url传参

把itemdatabound下的Session代码去掉后,不运行到itemcommand方法里,Session[nid]没有值。 怎么通过url传参,有具体代码吗? --------------------编程问答--------------------
引用 7 楼 siwanglongjuan 的回复:
还是根据url传参比较好,不要用session,不然你要打开多个新闻页怎么办?

“response.rediert(1.aspx?id);”??? 如何写。 --------------------编程问答--------------------
引用 4 楼 u010759692 的回复:
Quote: 引用 2 楼 dongxinxi 的回复:

有两条数据,DataList1_ItemDataBound 就会两遍,每一遍绑定一条,不然怎么叫ItemDataBound,与之对应的,还有个DataBound事件,那个才是只整个DataList的绑定

代码有点乱
n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
……
Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;
这两句是你手敲上去的,练打字呢?这里不应该使用Session
直接将带nid参数的URL给到LinkButton就行了

我应该把ItemDataBound下的代码移动到DataBound下吗?


不是,我上面只是解释,两条数据它本来就会跑两遍,那个没有问题
你的问题出在用Session传参
改成用URL传参就行了,比如
string r1 = Business.NewsBusiness.GetNewsUrl(n);
((LinkButton)(e.Item.FindControl("LinkButton1"))).PostBackUrl = "View.aspx?id=" + r1;
//去掉Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;

然后在View.aspx中通过Request.QueryString["id"]获取参数 --------------------编程问答-------------------- 不应该用session,直接传值就行
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,