最近刚写了个投票的系统,要求是列及行都是动态生成的
比如:
表A 投票项
    投票项1,投票项2,投票项3....
表B 人员表
    人员1,人员2,人员3....要求是动态生成以下效果的表:
    
       投票项1    投票项2     投票项3
人员1 单选按钮     单选按钮     单选按钮
人员2
人员3
             提交其中还要求动态生成单选按钮等服务器端控件
目前我采用的处理是在asp:Table中动态生成TableRow、TableCell、在把列和行的数据通过循环绑定,列表中同时动态生成RadioButtonList。目前的问题是页面生成速度嗷嗷慢,而且不能IsPostBack(好象是因为是动态生成控件的缘故,结果是提交的时候又重新生成了一次页面,速度更是可想而知了。),不知道各位老鸟有什么好的处理办法。
可能某些地方描述的不是很专业。
由于刚从java转到.net来,目前很菜,希望大家多多指教。
欢迎讲解思路,更欢迎发下代码供研究参考。
不胜感激。

解决方案 »

  1.   

    用Repeater 你把你想要的效果 截个图
      

  2.   

    首先:十分感谢这个怎么回复截图啊。页面上大概就是这么个表格形式
     
                         投票项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个表负责列头。
    表格中是动态加载的单选按钮
      

  3.   

    一次把要的数据全部准备好。
    然后拼要显示的table,
    不要查n次数据库,不会很慢
      

  4.   

    用Repeater 可以实现
    在ItemDataBound事件中动态加单选按钮
      

  5.   

    你好
    由于刚接触.net
    能不能发个代码片段
    谢谢
      

  6.   


    因为每次都动态生成,把viewstate关了
      

  7.   


    表1
      id  item
       1   考核项A
       2   考核项B
       3   考核项C
    表2
      id  name
      1   张3
      2   李4
      3   王5
      4   仁6 够模拟就成吧?
      

  8.   


    <%@ 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>
      

  9.   


    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);
            }
        }
    }
      

  10.   

    一次把要的数据全部准备好。 
    然后拼要显示的table, 
    不要查n次数据库,不会很慢 
      

  11.   

    晕了
    结完帖  内容怎么还都乱了呢。Sandy945 
    麻烦你在帖下
    C# code 部分吧
    谢谢