向[啊泰]高手求助,RDLC表控件动态创建列..

cookies10wen 2009-07-21 11:49:57
RT,RDLC中的表控件如何根据DataSet中列的多少而动态创建列???? (DataSet有多少列是不确定的)

请啊泰和各路高手请教...
...全文
298 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
athel2008 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 llsen 的回复:]
rdlc不太清楚

水表 为例,好像不支持这样的,
即使是阿泰之前写的动态列
也是知道最大列数,然后创建最大列
不足的后面可以隐藏

楼主可以考虑用其他工具
或者直接拼
[/Quote]

这位兄台,你说的阿泰写的这篇文章在哪啊 能给我个链接吗 谢谢 我也遇到了同样的问题,但是阿泰的那个解决方案我应该可以用。
zhaozhijun0207 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wjwboy 的回复:]
那也叫动态呀,根本就不通用呀。
[/Quote]
报什么错误?
wjwboy 2009-07-22
  • 打赏
  • 举报
回复
那也叫动态呀,根本就不通用呀。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Data;
using System.IO;

namespace WindowsApplication1
{
class ReportClass
{
public DataSet ReportData;
public FileStream ReportStream;
public string TableName;
public string CreateFileName;
public ReportClass()
{
ReportData = new DataSet();
CreateFileName = @"c:\TempRrport.rdlc";
}

public void GetStream(string ReportFile)
{
ReportStream = new FileStream(ReportFile, FileMode.Open, FileAccess.Read);
}


public void ShowReport()
{
Form ReportFrom = new Form();
ReportFrom.Text = "报表预览...";
ReportFrom.WindowState = FormWindowState.Maximized;

ReportViewer myReportViewer = new ReportViewer();
myReportViewer.Dock = DockStyle.Fill;
ReportFrom.Controls.Add(myReportViewer);

try
{
myReportViewer.Reset();
myReportViewer.LocalReport.LoadReportDefinition(ReportStream);
myReportViewer.LocalReport.DataSources.Add(new ReportDataSource(TableName, ReportData.Tables[TableName]));
myReportViewer.RefreshReport();
ReportFrom.ShowDialog();
}
catch (Exception e)
{
//MsgHelper.ShowErrorMsgBox("加裁报表出错!");
MsgHelper.ShowErrorMsgBox(e.ToString());
}

if (ReportStream != null)
ReportStream.Dispose();
}

public void CreateStream(string BaseReportFile)
{

FileStream myFile = new FileStream(BaseReportFile, FileMode.Open, FileAccess.Read);
StreamReader myRead = new StreamReader(myFile);

string myStr, myType = "", myFlag = "", c0 = "<TableColumns>", c1 = "</TableColumns>", dn = "<DataSet Name";
string myStrTrim, t0 = "<TableCell>", t1 = "</TableCell>", h0 = "<Header>", f0 = "<Fields>", d0 = "<Details>", f1 = "</Fields>";

//StringBuilder myss = new StringBuilder();
ListBox listBox1 = new ListBox(), listBox2 = new ListBox(), listBox3 = new ListBox();
listBox1.Items.Clear();
listBox2.Items.Clear();
listBox3.Items.Clear();

while ((myStr = myRead.ReadLine()) != null)
{
myStrTrim = myStr.Trim();
if (myStrTrim.Length >= t0.Length && myStrTrim.Substring(0, t0.Length) == t0)
myFlag = "0";
if (myStrTrim.Length >= t1.Length && myStrTrim.Substring(0, t1.Length) == t1)
myFlag = "1";

if (myStrTrim.Length >= h0.Length && myStrTrim.Substring(0, h0.Length) == h0)
myType = "h";
if (myStrTrim.Length >= d0.Length && myStrTrim.Substring(0, d0.Length) == d0)
myType = "d";
if (myStrTrim.Length >= f0.Length && myStrTrim.Substring(0, f0.Length) == f0)
{
myFlag = "0";
myType = "f";
}
if (myStrTrim.Length >= f1.Length && myStrTrim.Substring(0, f1.Length) == f1)
myFlag = "1";
if (myStrTrim.Length >= c0.Length && myStrTrim.Substring(0, c0.Length) == c0)
{
myFlag = "0";
myType = "c";
}
if (myStrTrim.Length >= c1.Length && myStrTrim.Substring(0, c1.Length) == c1)
myFlag = "1";

if (myFlag != "")
{
if (myType == "h")
listBox2.Items.Add(myStr);

if (myType == "d")
listBox3.Items.Add(myStr);

if (myType == "h" && myFlag == "1")
{
foreach (DataColumn myColumn in ReportData.Tables[TableName].Columns)
{
foreach (string myItem in listBox2.Items)
{
string myItemTrim, t = "<Textbox", v = "<Value>";
myItemTrim = myItem.Trim();

if (myItemTrim.Length >= t.Length && myItemTrim.Substring(0, t.Length) == t)
listBox1.Items.Add(myItem.Substring(0, myItem.IndexOf(t)) + "<Textbox Name=\"" + myColumn.ColumnName + "_Header\">");
else if (myItemTrim.Length >= v.Length && myItemTrim.Substring(0, v.Length) == v)
listBox1.Items.Add(myItem.Substring(0, myItem.IndexOf(v)) + "<Value>" + myColumn.ColumnName + "</Value>");
else
listBox1.Items.Add(myItem);
}
}
}

if (myType == "d" && myFlag == "1")
{
foreach (DataColumn myColumn in ReportData.Tables[TableName].Columns)
{
foreach (string myItem in listBox3.Items)
{
string myItemTrim, t = "<Textbox", v = "<Value>";
myItemTrim = myItem.Trim();


if (myItemTrim.Length >= t.Length && myItemTrim.Substring(0, t.Length) == t)
listBox1.Items.Add(myItem.Substring(0, myItem.IndexOf(t)) + "<Textbox Name=\"" + myColumn.ColumnName + "\">");
else if (myItemTrim.Length >= v.Length && myItemTrim.Substring(0, v.Length) == v)
listBox1.Items.Add(myItem.Substring(0, myItem.IndexOf(v)) + "<Value>=Fields!" + myColumn.ColumnName + ".Value</Value>");
else
listBox1.Items.Add(myItem);
}
}
}

if (myType == "f" && myFlag == "1")
{
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(f1)) + f0);
foreach (DataColumn myColumn in ReportData.Tables[TableName].Columns)
{
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(f1)) + " <Field Name=\"" + myColumn.ColumnName + "\">");
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(f1)) + " <DataField>" + myColumn.ColumnName + "</DataField>");
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(f1)) + " </Field>");
}
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(f1)) + f1);
}
if (myType == "c" && myFlag == "1")
{
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(c1)) + c0);
foreach (DataColumn myColumn in ReportData.Tables[TableName].Columns)
{
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(c1)) + " <TableColumn>");
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(c1)) + " <Width>" + "2in" + "</Width>");
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(c1)) + " </TableColumn>");
}
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(c1)) + c1);
}

if (myFlag == "1")
{
myType = "";
myFlag = "";
}

}
else
{
if (myStrTrim.Length >= dn.Length && myStrTrim.Substring(0, dn.Length) == dn)
listBox1.Items.Add(myStr.Substring(0, myStr.IndexOf(dn)) + "<DataSet Name=\"" + ReportData.Tables[TableName].TableName + "\">");
else
listBox1.Items.Add(myStr);
}
}
myRead.Close();
myFile.Close();

FileStream myStream = new FileStream(CreateFileName, FileMode.Create, FileAccess.ReadWrite);
StreamWriter myWriter = new StreamWriter(myStream);

foreach (string myItem in listBox1.Items)
{
myWriter.WriteLine(myItem);
}
myWriter.Flush();
myWriter.Close();
myStream.Dispose();

GetStream(CreateFileName);
}

}
zhaozhijun0207 2009-07-22
  • 打赏
  • 举报
回复
2楼的动态列 效果不错哦
keke1983 2009-07-22
  • 打赏
  • 举报
回复
我倒是作出来rdlc的动态列报表 就是绑定一个datable 但是不能合并行
llsen 2009-07-21
  • 打赏
  • 举报
回复
rdlc不太清楚

水表 为例,好像不支持这样的,
即使是阿泰之前写的动态列
也是知道最大列数,然后创建最大列
不足的后面可以隐藏

楼主可以考虑用其他工具
或者直接拼
wuyq11 2009-07-21
  • 打赏
  • 举报
回复
动态生成数据源绑定到报表
参考

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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