
正文
ReportViewer中修改rdlc图表中显示的数据
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
将rdlc以xml的格式打开,修改里面的数据,实现方式如下:
public MemoryStream GenerateRdlc()
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("E:/RSTest/Report/Report4.rdlc");
XmlNodeList xList = xmlDoc.ChildNodes;
XmlNode xNode = xList.Item(1);
XmlNodeList xx = xNode.ChildNodes;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < xx.Count; i++)
{
if (xx[i].Name.ToLower() == "body")
{
XmlNode xnBody = xx[i];
XmlNodeList xnBodyChildList = xnBody.ChildNodes;
for (int j = 0; j < xnBodyChildList.Count; j++)
{
if (xnBodyChildList[j].Name == "ReportItems")
{
XmlNode xHeader = xnBodyChildList[j];
XmlElement xe = xHeader["Chart"];
XmlNodeList xTable = xe.ChildNodes;
for (int k = 0; k < xTable.Count; k++)
{
if (xTable[k].Name == "SeriesGroupings")
{
XmlNode xnseries = xTable[k];//SeriesGrouping
XmlNodeList xs = xnseries.ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes;
XmlNode xmlnode1 = xs[0].ChildNodes.Item(0);
xmlnode1.InnerText = "=\"小学总人员\"& Fields!小学总人员.Value";
xmlnode1.InnerXml = "=\"小学总人员\"& Fields!小学总人员.Value";
XmlNode xmlnode2 = xs[1].ChildNodes.Item(0);
xmlnode2.InnerText = "=\"初中总人员\"& Fields!初中总人员.Value";
xmlnode2.InnerXml = "=\"初中总人员\"& Fields!初中总人员.Value";
XmlNode xmlnode3 = xs[2].ChildNodes.Item(0);
xmlnode3.InnerText = "=\"高中总人员\"& Fields!高中总人员.Value";
xmlnode3.InnerXml = "=\"高中总人员\"& Fields!高中总人员.Value";
}
if (xTable[k].Name == "ChartData")
{
XmlNode xnseries = xTable[k];//SeriesGrouping
XmlNodeList xs = xnseries.ChildNodes;
XmlNode xmlnode1 = xs[0].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0);
xmlnode1.InnerText = "=Sum(Fields!小学总人员.Value)";
//xs[0].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(1).Name=DataLabel
XmlNode xmlnode11 = xs[0].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(1).ChildNodes.Item(0);
xmlnode11.InnerText = "=FormatPercent(Fields!小学总人员.Value/(Fields!小学总人员.Value+Fields!初中总人员.Value+Fields!高中总人员.Value))";
XmlNode xmlnode2 = xs[1].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0);
xmlnode2.InnerText = "=Sum(Fields!初中总人员.Value)";
XmlNode xmlnode22 = xs[1].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(1).ChildNodes.Item(0);
xmlnode22.InnerText = "=FormatPercent(Fields!初中总人员.Value/(Fields!小学总人员.Value+Fields!初中总人员.Value+Fields!高中总人员.Value))";
XmlNode xmlnode3 = xs[2].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(0);
xmlnode3.InnerText = "=Sum(Fields!高中总人员.Value)";
XmlNode xmlnode33 = xs[2].ChildNodes.Item(0).ChildNodes.Item(0).ChildNodes.Item(1).ChildNodes.Item(0);
xmlnode33.InnerText = "=FormatPercent(Fields!高中总人员.Value/(Fields!小学总人员.Value+Fields!初中总人员.Value+Fields!高中总人员.Value))";
}
}
}
}
}
}
xmlDoc.Save("E:/RSTest/Report/Report4.rdlc");
MemoryStream ms = new MemoryStream();
XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
serializer.Serialize(ms, xmlDoc);
ms.Position = 0;
return ms;
}
调用上面的方法
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection connection = new SqlConnection(connString);
connection.Open();
string c = "select sum(小学.学校总数) as 小学总数,sum(初中.学校总数) as 初中总数,sum(高中.学校总数) as 高中总数, sum(小学.总人员) as 小学总人员,sum(初中.总人员) as 初中总人员,sum(高中.总人员) as 高中总人员, sum(小学.学生电脑总量) as 小学学生电脑总量,sum(初中.学生电脑总量) as 初中学生电脑总量,sum(高中.学生电脑总量) as 高中学生电脑总量, sum(小学.在编人数) as 小学在编人数,sum(初中.在编人数) as 初中在编人数,sum(高中.在编人数) as 高中在编人数, sum(小学.教师电脑总量) as 小学教师电脑总量,sum(初中.教师电脑总量) as 初中教师电脑总量,sum(高中.教师电脑总量) as 高中教师电脑总量, sum(小学.多媒体教室) as 小学多媒体教室,sum(初中.多媒体教室) as 初中多媒体教室,sum(高中.多媒体教室) as 高中多媒体教室, sum(小学.计算机网络教室) as 小学计算机网络教室,sum(初中.计算机网络教室) as 初中计算机网络教室,sum(高中.计算机网络教室) as 高中计算机网络教室, sum(小学.建有独立校园网站学校) as 小学建有独立校园网站学校,sum(初中.建有独立校园网站学校) as 初中建有独立校园网站学校,sum(高中.建有独立校园网站学校) as 高中建有独立校园网站学校, sum(小学.建有独立校园网络学校) as 小学建有独立校园网络学校,sum(初中.建有独立校园网络学校) as 初中建有独立校园网络学校,sum(高中.建有独立校园网络学校) as 高中建有独立校园网络学校, sum(小学.硬件投入) as 小学硬件投入,sum(初中.硬件投入) as 初中硬件投入,sum(高中.硬件投入) as 高中硬件投入, sum(小学.软件投入) as 小学软件投入,sum(初中.软件投入) as 初中软件投入,sum(高中.软件投入) as 高中软件投入, sum(小学.电教示范学校) as 小学电教示范学校,sum(初中.电教示范学校) as 初中电教示范学校,sum(高中.电教示范学校) as 高中电教示范学校, sum(小学.会制作网页和动画教室) as 小学会制作网页和动画教室,sum(初中.会制作网页和动画教室) as 初中会制作网页和动画教室,sum(高中.会制作网页和动画教室) as 高中会制作网页和动画教室, sum(小学.班级通学校) as 小学班级通学校,sum(初中.班级通学校) as 初中班级通学校,sum(高中.班级通学校) as 高中班级通学校, sum(小学.班班多媒体学校) as 小学班班多媒体学校,sum(初中.班班多媒体学校) as 初中班班多媒体学校,sum(高中.班班多媒体学校) as 高中班班多媒体学校, sum(小学.县区班班通) as 小学县区班班通,sum(初中.县区班班通) as 初中县区班班通,sum(高中.县区班班通) as 高中县区班班通 from 小学,初中,高中 where 小学.城市=初中.城市 and 初中.城市=高中.城市";//绑定rdlc文件的数据集
SqlCommand cmd = new SqlCommand(c, connection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable ds = new DataTable();
da.Fill(ds);
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.LoadReportDefinition(GenerateRdlc());
ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1_DataTable1", ds));
ReportViewer1.LocalReport.Refresh(); }
目前还尚存在问题,通过浏览器查看时,首次点击按钮修改后的数据显示不出来,可以在浏览器中点击“清除会话Cookie”后在点击按钮,修改后的数据会显示出来,也可以关闭浏览器重新打开,修改后的数据会显示出来,这种思路也许不是正确的,希望有知道的大侠看到本篇文章时能给出指导意见!






