最近刚写了个投票的系统,要求是列及行都是动态生成的
比如:
表A 投票项
投票项1,投票项2,投票项3....
表B 人员表
人员1,人员2,人员3....要求是动态生成以下效果的表:
投票项1 投票项2 投票项3
人员1 单选按钮 单选按钮 单选按钮
人员2
人员3
提交其中还要求动态生成单选按钮等服务器端控件
目前我采用的处理是在asp:Table中动态生成TableRow、TableCell、在把列和行的数据通过循环绑定,列表中同时动态生成RadioButtonList。目前的问题是页面生成速度嗷嗷慢,而且不能IsPostBack(好象是因为是动态生成控件的缘故,结果是提交的时候又重新生成了一次页面,速度更是可想而知了。),不知道各位老鸟有什么好的处理办法。
可能某些地方描述的不是很专业。
由于刚从java转到.net来,目前很菜,希望大家多多指教。
欢迎讲解思路,更欢迎发下代码供研究参考。
不胜感激。
比如:
表A 投票项
投票项1,投票项2,投票项3....
表B 人员表
人员1,人员2,人员3....要求是动态生成以下效果的表:
投票项1 投票项2 投票项3
人员1 单选按钮 单选按钮 单选按钮
人员2
人员3
提交其中还要求动态生成单选按钮等服务器端控件
目前我采用的处理是在asp:Table中动态生成TableRow、TableCell、在把列和行的数据通过循环绑定,列表中同时动态生成RadioButtonList。目前的问题是页面生成速度嗷嗷慢,而且不能IsPostBack(好象是因为是动态生成控件的缘故,结果是提交的时候又重新生成了一次页面,速度更是可想而知了。),不知道各位老鸟有什么好的处理办法。
可能某些地方描述的不是很专业。
由于刚从java转到.net来,目前很菜,希望大家多多指教。
欢迎讲解思路,更欢迎发下代码供研究参考。
不胜感激。
投票项1 投票项2 投票项3
人员1 单选按钮 单选按钮 单选按钮
人员2 单选按钮 单选按钮 单选按钮
人员3 单选按钮 单选按钮 单选按钮
提交 表格的列名 (投票项1、投票项2、投票项3...)是从 表1 中读出来动态绑定的,表1中数据量不确定
人员1、人员2、人员3 是从 表2 读出来动态绑定的,表1中数据量也不确定
单选按钮是通过Table1.Rows[i].Cells[j].Controls.Add 动态加载的也就是说aspx页面中的表格的行和列都是根据数据库中的2个表的数据动态生成的,1个表负责行头,1个表负责列头。
表格中是动态加载的单选按钮
然后拼要显示的table,
不要查n次数据库,不会很慢
在ItemDataBound事件中动态加单选按钮
由于刚接触.net
能不能发个代码片段
谢谢
因为每次都动态生成,把viewstate关了
表1
id item
1 考核项A
2 考核项B
3 考核项C
表2
id name
1 张3
2 李4
3 王5
4 仁6 够模拟就成吧?
<%@ 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>
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);
}
}
}
然后拼要显示的table,
不要查n次数据库,不会很慢
结完帖 内容怎么还都乱了呢。Sandy945
麻烦你在帖下
C# code 部分吧
谢谢