生成DataTable 绑定到repeater(望帮助)

zhifeng0014 2009-03-09 01:58:21
Repeater控件绑定数据库,每一项前面有3个列(1个checkbox和2个按钮做删除和修改项)
我想这样,通过按钮CreateTable创建一个副表,表的来源是上面的Repeater(不要前面的3个列,因为等下输出excel)
怎么创建这个副表呢
...全文
1041 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iloveaspnet2008 2009-03-09
  • 打赏
  • 举报
回复
帮你顶一下!!!!
zhifeng0014 2009-03-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 liuyeede 的回复:]
你的思路有问题,在第一个Repeater绑定以前,就应该通过第一个Repeater的数据源来创建一个DataTable类型的副表表就会简单很多。
[/Quote]
明白了 ,多谢大家
我姓区不姓区 2009-03-09
  • 打赏
  • 举报
回复

DataTable dt = (rpt_SelectList.DataSource as DataTable).Copy();//dt即为副表
zhifeng0014 2009-03-09
  • 打赏
  • 举报
回复
慢慢分析各位大哥的,能力有限 可能看懂要点时间,(跟分会慢些,不好意思)
附上我的Repeater的代码
<asp:Repeater ID="rpt_SelectList" runat="server" OnItemCommand="rpt_SelectList_ItemCommand">
<HeaderTemplate>
<table style="margin:0px; border:1px solid #000000; width:100%;" cellpadding="0">
<tr style="background-color:#c5c5c5">
<td>选择</td>
<td>
客户名称</td>
<td>
报故障人</td>
<td>
报故障时间</td>
<td>
客户联系人</td>
<td>
联系电话</td>
<td>
机号/板件号</td>
<td>
上门服务情况</td>
<td>
问题解决情况和过程</td>
<td></td>
<td></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr >
<td><asp:CheckBox ID="CheckBox1" runat="server" /></td>
<td>
<asp:TextBox ID="tb_ClientName" runat="server" Text='<%# Eval("ClientName") %>' Width="120px" /></td>
<td>
<asp:TextBox ID="tb_ReportUser" runat="server" Text='<%# Eval("ReportUser") %>' Width="50px"/></td>
<td>
<asp:TextBox ID="tb_AcceptTime" runat="server" Text='<%# Eval("AcceptTime") %>' Width="80px" onclick="SelectDate(this)" /></td>
<td>
<asp:TextBox ID="tb_ConnUser" runat="server" Text='<%# Eval("ConnUser") %>' Width="60px" /></td>
<td>
<asp:TextBox ID="tb_ClientPhone" runat="server" Text='<%# Eval("ClientPhone") %>'
Width="80px" /></td>
<td>
<asp:TextBox ID="tb_sn" runat="server" Text='<%# Eval("sn") %>' Width="300px" ToolTip='<%# Eval("sn") %>'/></td>
<td>
<asp:TextBox ID="tb_VisitSituation" runat="server" Text='<%# Eval("VisitSituation") %>'
Width="200px" /></td>
<td>
<asp:TextBox ID="tb_Report" runat="server" Text='<%# Eval("Report") %>' Width="200px" /></td>
<td><asp:Button ID="btn_Modify" runat="server" Text="修改" CommandName="Mod" CommandArgument='<%# Eval("caseID") %>' /></td>
<td><asp:Button ID="btn_Del" runat="server" Text="删除" CommandName="Del" CommandArgument='<%# Eval("caseID") %>' OnClientClick="return confirm('确定删除吗?')" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
<tr><td colspan="10" style="text-align:center"><asp:Label ID="lbl_count" runat="server"></asp:Label></td></tr>
</table></FooterTemplate>
</asp:Repeater>
通过这个Repeater创建想要的副表
liuyeede 2009-03-09
  • 打赏
  • 举报
回复
你的思路有问题,在第一个Repeater绑定以前,就应该通过第一个Repeater的数据源来创建一个DataTable类型的副表表就会简单很多。
migercai 2009-03-09
  • 打赏
  • 举报
回复
最简单的方法
把repeter的数据源(datatable)声明成页面级别的变量(静态的)
到处excel的时候就可以直接用,这种方法在资源上消耗很大
还有就是缓存
这个有技术难度
zzxap 2009-03-09
  • 打赏
  • 举报
回复
select 你要的数据 from table
填充到dataset,然后把dataset的数据导出到excel

[code=C#]
//由dataset导出Excel
public void CreateExcel(DataSet ds,string typeid,string FileName)
{
HttpResponse resp;
resp = Page.Response;
resp.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
resp.AppendHeader("Content-Disposition", "attachment;filename=" + FileName);
string colHeaders= "", ls_item="";
int i=0;

//定义表对象和行对像,同时用DataSet对其值进行初始化
DataTable dt=ds.Tables[0];
DataRow[] myRow=dt.Select("");
// typeid=="1"时导出为EXCEL格式文档;typeid=="2"时导出为XML格式文档
if(typeid=="1")
{
//取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符
for(i=0;i<dt.Columns.Count;i++)
{
if(i==dt.Columns.Count-1)
{
colHeaders +=dt.Columns[i].Caption.ToString() +"\n";
}
else
{
colHeaders+=dt.Columns[i].Caption.ToString()+"\t";
}
}
//向HTTP输出流中写入取得的数据信息
resp.Write(colHeaders);
//逐行处理数据
foreach(DataRow row in myRow)
{
//在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n
for(i=0;i<dt.Columns.Count;i++)
{

if(i==dt.Columns.Count-1)
{
ls_item += row[i].ToString() +"\n";
}
else
{
ls_item +=row[i].ToString() + "\t";
}
}
//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
resp.Write(ls_item);
ls_item="";
}
}
else
{
if(typeid=="2")
{
//从DataSet中直接导出XML数据并且写到HTTP输出流中
resp.Write(ds.GetXml());
}
}
//写缓冲区中的数据到HTTP头文档中
resp.End();
}

[/CODE]
CutBug 2009-03-09
  • 打赏
  • 举报
回复
写过一个列子,你可以参考一下
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="b.aspx.cs" Inherits="b" %>

<!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>
<style>
.ptbl{width:400px;background-color:#000}
.ptbl tr{background-color:#fff}
.ptbl td{text-align:center;}
</style>
<script language="javascript" type="text/javascript">
// <!CDATA[
//展开或隐藏函数
function expend(obj,flag)
{
var chld = obj.parentNode.nextSibling;
if(flag=="+")
{
obj.innerText="-";
chld.style.display="block";
}else
{
obj.innerText="+";
chld.style.display="none";
}
}
var arr=[];//存放显示列

//checkbox click事件
function changeCol(ischecked,colIndex)
{
if(ischecked)
{
arr.push(colIndex);
arr.sort();
}else
{
var m = arr.indexOf(colIndex);
delete arr[m];
}

resetChildGrid();
}

//数组查找函数
function Array.prototype.indexOf(val)
{
for(var i=0;i<this.length;i++)
{
if(this[i]==val) return i;
}
return -1;
}

//显示隐藏列
function resetChildGrid()
{
var chldTbls= document.getElementsByTagName("table");
for(var i=0;i<chldTbls.length;i++)
{
if(chldTbls[i].className=="ctbl")
{
for(var j=0;j<chldTbls[i].rows.length;j++)
{
for(var k=0;k<chldTbls[i].rows[j].cells.length;k++)
{
var cell = chldTbls[i].rows[j].cells[k];
cell.style.display=arr.indexOf(k)!=-1?"block":"none";

}
}
}
}

}

//onload初始化存放显示列数组arr
window.onload=function()
{
var chkTbl = document.getElementById("ColumnsNames");
var cells = chkTbl.rows[0].cells;
for(var i=0;i<cells.length;i++)
{
arr.push(i);
}

}

// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
自定义列:<asp:CheckBoxList runat="server" ID="ColumnsNames" RepeatDirection="Horizontal"></asp:CheckBoxList>
<asp:Repeater runat="server" ID="RptParent" OnItemDataBound="RptParent_ItemDataBound">
<HeaderTemplate>
<table class="ptbl" cellpadding="0" cellspacing="1">
<tr>
<th width="20px"></th>
<th width="30%">性别</th>
<th width="30%">人数</th>
<th>百分比</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td style="cursor:pointer" onclick="expend(this,this.innerText)">+</td>
<td><%# Convert.ToInt32(Eval("Sex"))==0?"男":"女" %></td>
<td><%# Eval("Peosons")%></td>
<td><%# Eval("percent")%></td>
</tr>
<tr style="display:none">
<td></td>
<td colspan="3">
<asp:Repeater runat="server" ID="RptChld">
<HeaderTemplate>
<table width="100%" class="ctbl">
<tr>
<th>Name</th>
<th>Sex</th>
<th>Age</th>
<th>Address</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr >
<td><%# Eval("Name") %></td>
<td><%# Convert.ToInt32(Eval("Sex"))==0?"男":"女" %></td>
<td><%# Eval("Age") %></td>
<td><%# Eval("Address") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>

</td>
</tr>

</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
</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 b : System.Web.UI.Page
{

protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
this.RptParent.DataSource = this.GroupSource;
this.RptParent.DataBind();
int m = 0;
foreach (DataColumn col in DTLSource.Columns)
{
ListItem list = new ListItem(col.ColumnName);
list.Selected = true;
list.Attributes.Add("onclick", "changeCol(this.checked,'" + m.ToString() + "')");
ColumnsNames.Items.Add(list);
m++;
}
}

}

/// <summary>
/// 汇总
/// </summary>
private DataTable GroupSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add("Sex", typeof(int));
dt.Columns.Add("Peosons", typeof(int));
dt.Columns.Add("percent", typeof(string));
dt.Rows.Add(0, 2,"40%");
dt.Rows.Add(1, 3, "60%");
return dt;
}
}

/// <summary>
/// 明细
/// </summary>
private DataTable DTLSource
{
get
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Sex", typeof(int));
dt.Columns.Add("Age", typeof(int));
dt.Columns.Add("Address", typeof(string));

dt.Rows.Add("A1",0,28,"上海");
dt.Rows.Add("A2", 0, 22, "江苏");
dt.Rows.Add("B1", 1, 21, "浙江");
dt.Rows.Add("B2", 1, 22, "山东");
dt.Rows.Add("B3", 1, 27, "广州");
return dt;
}
}

protected void RptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType== ListItemType.AlternatingItem)
{
int sex =(int)((DataRowView)e.Item.DataItem)["Sex"] ;
Repeater chld = e.Item.FindControl("RptChld") as Repeater;
DataView dv = new DataView(this.DTLSource);
dv.Sort = "Sex";
dv.RowFilter = "Sex="+sex.ToString();
chld.DataSource = dv;
chld.DataBind();

}
}
}
can_er008 2009-03-09
  • 打赏
  • 举报
回复
对Repeater中的二维数据进行遍历,里层循环把第四列取出放入副表的第一列,以此类推直到遍历到最后一列,外层循环遍历行。
zhifeng0014 2009-03-09
  • 打赏
  • 举报
回复
不想重新又从数据库中调数据生成副表,能不能根据第一张表生成,望详细代码
给分的 谢谢
德仔 2009-03-09
  • 打赏
  • 举报
回复
就是嵌套repeat是不

数据源自给自足的Repeater
该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=15793

Repeater控件显示主-从关系数据表的方法
该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=14933

DataGrid中嵌套使用Repeater
该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=10228

使用嵌套的Repeater控件显示分级数
该文章转载自德仔工作室:http://www.dezai.cn/Article_Show.asp?ArticleID=6938

62,267

社区成员

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

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

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

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