下午遇到Datalist的问题,希望坛友给个思路。
目的:控制datalist的显示数量,点击标题进入与id相对应的内容。问题:以前默认首页都是显示一项,今天想让每页显示两条新闻,就把pds.Pagesize改为2,问题就出来了,插入断点,DataList1_ItemDataBound方法执行了两遍,第一遍Session["nid"]=1(这是对的),第二遍Session["nid"]=2,点nid=1的标题结果显示nid=2的新闻内容了。
datalist dataset --------------------编程问答-------------------- 人工置顶,求思路。 --------------------编程问答-------------------- 有两条数据,DataList1_ItemDataBound 就会两遍,每一遍绑定一条,不然怎么叫ItemDataBound,与之对应的,还有个DataBound事件,那个才是只整个DataList的绑定
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;
}
代码有点乱
n.Nid = ((Label)(e.Item.FindControl("nidLabel"))).Text;
……
Session["nid"] = ((Label)(e.Item.FindControl("nidLabel"))).Text;
这两句是你手敲上去的,练打字呢?这里不应该使用Session
直接将带nid参数的URL给到LinkButton就行了
--------------------编程问答-------------------- 你的 新闻内容 页是不是根据Session["nid"]显示的内容啊 --------------------编程问答--------------------
我应该把ItemDataBound下的代码移动到DataBound下吗? --------------------编程问答--------------------
对啊,但现在我一页显示两个,它就循环两遍,导致我点击nid为1的新闻标题,进nid=2的内容页面。 --------------------编程问答-------------------- 那就别在数据绑定的时候修改Session了,把修改Session的工作放到DataList1_ItemCommand里,然后直接跳转;或者通过url传参 --------------------编程问答-------------------- 还是根据url传参比较好,不要用session,不然你要打开多个新闻页怎么办? --------------------编程问答--------------------
把itemdatabound下的Session代码去掉后,不运行到itemcommand方法里,Session[nid]没有值。 怎么通过url传参,有具体代码吗? --------------------编程问答--------------------
“response.rediert(1.aspx?id);”??? 如何写。 --------------------编程问答--------------------
不是,我上面只是解释,两条数据它本来就会跑两遍,那个没有问题
你的问题出在用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