关于GridView或者asp:Table动态绑定数据的问题

lucas406 2009-04-08 05:45:21
最近刚写了个投票的系统,要求是列及行都是动态生成的
比如:
表A 投票项
投票项1,投票项2,投票项3....
表B 人员表
人员1,人员2,人员3....

要求是动态生成以下效果的表:

投票项1 投票项2 投票项3
人员1 单选按钮 单选按钮 单选按钮
人员2
人员3
提交

其中还要求动态生成单选按钮等服务器端控件
目前我采用的处理是在asp:Table中动态生成TableRow、TableCell、在把列和行的数据通过循环绑定,列表中同时动态生成RadioButtonList。

目前的问题是页面生成速度嗷嗷慢,而且不能IsPostBack(好象是因为是动态生成控件的缘故,结果是提交的时候又重新生成了一次页面,速度更是可想而知了。),不知道各位老鸟有什么好的处理办法。
可能某些地方描述的不是很专业。
由于刚从java转到.net来,目前很菜,希望大家多多指教。
欢迎讲解思路,更欢迎发下代码供研究参考。
不胜感激。
...全文
374 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
caotoulei 2009-11-13
  • 打赏
  • 举报
回复
mvc了mvc了
lucas406 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Sandy945 的回复:]
等会儿帮你写个DEMO
[/Quote]
谢谢 辛苦啦~~
阿非 2009-04-09
  • 打赏
  • 举报
回复
你 贴点测试数据
阿非 2009-04-09
  • 打赏
  • 举报
回复
等会儿帮你写个DEMO
lucas406 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lzf1988119 的回复:]
用Repeater 可以实现
在ItemDataBound事件中动态加单选按钮
[/Quote]
你好
由于刚接触.net
能不能发个代码片段
谢谢
lucas406 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sharpblade 的回复:]
一次把要的数据全部准备好。
然后拼要显示的table,
不要查n次数据库,不会很慢
[/Quote]
目前的问题就是速度慢
而且由于都是动态生成的控件,我在提交这个页面的时候又生成了一次页面,要不然就在cs中取不到页面的东西。
望指教
lzf1988119 2009-04-09
  • 打赏
  • 举报
回复
用Repeater 可以实现
在ItemDataBound事件中动态加单选按钮
sharpblade 2009-04-09
  • 打赏
  • 举报
回复
一次把要的数据全部准备好。
然后拼要显示的table,
不要查n次数据库,不会很慢
lucas406 2009-04-09
  • 打赏
  • 举报
回复
好了~~~
3q~
lucas406 2009-04-09
  • 打赏
  • 举报
回复
好了~~~
3q~
阿非 2009-04-09
  • 打赏
  • 举报
回复
现在好了吧
lucas406 2009-04-09
  • 打赏
  • 举报
回复
晕了
结完帖 内容怎么还都乱了呢。。。。

Sandy945
麻烦你在帖下
C# code 部分吧
谢谢
lucas406 2009-04-09
  • 打赏
  • 举报
回复
收到
十分感谢

结了~~~~
huang_net 2009-04-09
  • 打赏
  • 举报
回复
一次把要的数据全部准备好。
然后拼要显示的table,
不要查n次数据库,不会很慢
阿非 2009-04-09
  • 打赏
  • 举报
回复

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class temp_Default : System.Web.UI.Page
{

private int index = 0, count = 0;
private string[] state;


private DataTable getDateTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("columnName", typeof(String)));
DataRow dr;
for (int i = 0; i < 10; i++)
{
dr = dt.NewRow();
dr[0] = "人员" + i.ToString();
dt.Rows.Add(dr);
}
return dt;
}

private DataTable getDt()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("columnName", typeof(String)));
DataRow dr;
for (int i = 0; i < 5; i++)
{
dr = dt.NewRow();
dr[0] = "选项" + i.ToString();
dt.Rows.Add(dr);
}
return dt;

}


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = getDt();
if (dt != null && dt.Rows.Count > 0)
{
count = dt.Rows.Count;
}
Repeater1.DataSource = dt;
Repeater1.DataBind();
rp.DataSource = getDateTable();
rp.DataBind();
hidCount.Value = index.ToString();
}
}
protected void rp_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
DataRowView drv = e.Item.DataItem as DataRowView;
Literal lit = new Literal();
if (drv != null)
{
string html = "<tr id='t" + index.ToString() + "'><td>" + drv["columnName"].ToString() + "</td>";

//Random r = new Random();
//int checkFlag = r.Next(0, 4);
int temp;
for (int i = 0; i < count; i++)
{

if (!IsPostBack)
{
html += "<td align='center' ><input type='radio' " + (i == 0 ? "checked='true'" : "") + " name='" + drv["columnName"].ToString() + "' /></td>";
}
else if (state != null && state.Length > index && int.TryParse(state[index], out temp))
{
html += "<td align='center' ><input type='radio'" + (state[index] == i.ToString() ? "checked='true'" : "") + " name='" + drv["columnName"].ToString() + "' /></td>";
}
else
{
html += "<td align='center' ><input type='radio' " + (i == 0 ? "checked='true'" : "") + " name='" + drv["columnName"].ToString() + "' /></td>";
}
}
html += "</tr>";
lit.Text = html;
e.Item.Controls.Add(lit);
index++;
}
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{

string value = hid.Value.TrimEnd(',');
DataTable dt = getDt();
if (dt != null && dt.Rows.Count > 0)
{
count = dt.Rows.Count;
}
Repeater1.DataSource = dt;
Repeater1.DataBind();
if (hid.Value.Split(',').Length > 0)
{
state = hid.Value.Split(',');
}
rp.DataSource = getDateTable();
rp.DataBind();
hidCount.Value = index.ToString();
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
DataRowView drv = e.Item.DataItem as DataRowView;
Literal lit = new Literal();
if (drv != null)
{
lit.Text = "<td align='center' >" + drv["columnName"].ToString() + "</td>";
}
e.Item.Controls.Add(lit);
}
}
}

阿非 2009-04-09
  • 打赏
  • 举报
回复

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="temp_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
<script>
function setValue()
{
var len=parseInt(document.getElementById('<%=hidCount.ClientID %>').value);


var hid=document.getElementById('<%=hid.ClientID %>');
hid.value='';
for(var i=0;i<len;i++)
{
var el=document.getElementById('t'+i).getElementsByTagName('input');

for(var j=0;j<el.length;j++)
{

if((el[j].type=='radio')&&(el[j].checked))
{
hid.value+=j+',';

}
}

}

}
</script>
</head>
<body>
<form id="form1" runat="server">

<table>
<tr><td align='center'></td><asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"></asp:Repeater></tr>
<asp:Repeater ID="rp" runat="server" OnItemDataBound="rp_ItemDataBound"></asp:Repeater>
</table>

<asp:HiddenField ID="hid" runat="server" /><asp:HiddenField ID="hidCount" runat="server" />
<asp:Button ID="btnSubmit" runat="server" Text="提交" OnClientClick="setValue();" OnClick="btnSubmit_Click" />
</form>
</body>
</html>

lucas406 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Sandy945 的回复:]
你 贴点测试数据
[/Quote]

表1
id item
1 考核项A
2 考核项B
3 考核项C
表2
id name
1 张3
2 李4
3 王5
4 仁6

够模拟就成吧?
lucas406 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sharpblade 的回复:]
引用 6 楼 lucas406 的回复:
引用 4 楼 sharpblade 的回复:
一次把要的数据全部准备好。
然后拼要显示的table,
不要查n次数据库,不会很慢

目前的问题就是速度慢
而且由于都是动态生成的控件,我在提交这个页面的时候又生成了一次页面,要不然就在cs中取不到页面的东西。
望指教



因为每次都动态生成,把viewstate关了
[/Quote]
已经关了
sharpblade 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Sandy945 的回复:]
等会儿帮你写个DEMO
[/Quote]

你还真好,还帮写代码
sharpblade 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lucas406 的回复:]
引用 4 楼 sharpblade 的回复:
一次把要的数据全部准备好。
然后拼要显示的table,
不要查n次数据库,不会很慢

目前的问题就是速度慢
而且由于都是动态生成的控件,我在提交这个页面的时候又生成了一次页面,要不然就在cs中取不到页面的东西。
望指教

[/Quote]

因为每次都动态生成,把viewstate关了
加载更多回复(3)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧