2013年6月26日 星期三

LocalReport - 使用子報表

專案架構如下,專案下產生兩個報表(父報表與子報表)。

image

新增TypedDataSet(Ex:dsReport.xsd),範例定義如下。

image

在myReport.rdlc報表中,設定資料集屬性。

SNAGHTMLf854e7

在myReport.rdlc報表中,新增子報表。

image

在myReport.rdlc報表中,設定[子報表屬性]。

SNAGHTML1016ff6

設定要傳給子報表的參數。

SNAGHTML1022bc6

在mySubReport.rdlc報表中,設定資料集屬性。

SNAGHTML1041846

在mySubReport.rdlc報表中,設定參數,參數名稱要和[子報表參數]設定一致(EX:OrderID)。

image

SNAGHTML1074638

程式部分:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
</div>
<asp:Button ID="btnShowReport" runat="server" Text="顯示報表" onclick="btnShowReport_Click"/>
<rsweb:ReportViewer ID="ReportViewer1" Width="100%"
runat="server">
</rsweb:ReportViewer>
</form>
</body>
</html>
view raw ShowReport.aspx hosted with ❤ by GitHub
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Microsoft.Reporting.WebForms;
namespace TestSubReport
{
public partial class ShowReport : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (this.IsPostBack)
return;
}
private void ShowReportData()
{
ReportViewer1.Visible = true;
//子報表繫結的事件
ReportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = HttpContext.Current.Server.MapPath(string.Format("~\\bin\\{0}", "myReport.rdlc"));
DataTable tbl = this.GetMasterData();
ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("myOrders", tbl));
ReportViewer1.LocalReport.Refresh();
}
/// <summary>
/// 繫結子報表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
//取得參數
string orderid = e.Parameters["OrderID"].Values[0];
//取得明細資料
DataTable tbl = this.GetDetailData(orderid);
//繫結子報表
e.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("myOrdersDetail", tbl));
}
/// <summary>
/// 點擊[顯示報表]
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnShowReport_Click(object sender, EventArgs e)
{
this.ShowReportData();
}
/// <summary>
/// 取得單頭資料
/// </summary>
/// <returns></returns>
private DataTable GetMasterData()
{
DataTable tbl = new DataTable();
DataColumn col = new DataColumn("OrderID");
tbl.Columns.Add(col);
DataRow row = tbl.NewRow();
row["OrderID"] = "A001";
DataRow row2 = tbl.NewRow();
row2["OrderID"] = "A002";
tbl.Rows.Add(row);
tbl.Rows.Add(row2);
return tbl;
}
/// <summary>
/// 取得明細資料
/// </summary>
/// <param name="OrderID"></param>
/// <returns></returns>
private DataTable GetDetailData(string OrderID)
{
DataTable dtDetail = new DataTable();
DataColumn col = new DataColumn("OrderID");
DataColumn col2 = new DataColumn("Item");
dtDetail.Columns.Add(col);
dtDetail.Columns.Add(col2);
DataRow row = dtDetail.NewRow();
row["OrderID"] = "A001";
row["Item"] = "A001-1";
DataRow row2 = dtDetail.NewRow();
row2["OrderID"] = "A002";
row2["Item"] = "A002-2";
dtDetail.Rows.Add(row);
dtDetail.Rows.Add(row2);
var query = from data in dtDetail.AsEnumerable()
where data.Field<String>("OrderID") == OrderID
select data;
DataTable tbl = query.CopyToDataTable<DataRow>();
return tbl;
}
}
}
view raw ShowReport.cs hosted with ❤ by GitHub

打包:下載

2013年6月18日 星期二

NPOI與RDLC衝突

VS2010在寫報表時,因為有同時使用NPOI。

結果在編輯報表時,加入[資料表]時,整個專案就關掉了。

錯誤是發生在選擇資料集(加入資料表會去選資料集)的時候。

查了一下Google發現有相同的問題

簡易解法:

  • NPOI某版本與RDLC互相衝突,換新版本就會好。
  • 或是Report獨立另外一個專案。

MSSQL 產生Table結構含資料的指令碼

資料庫按右鍵選擇(1)工作(2)產生指令碼。

image

在此勾選你要匯出的table,並點選下一步。

SNAGHTML1cc3980

 

點選[進階],設定要匯出的資訊。

SNAGHTML1d6b295
因為要匯出table的資料與結構的語法,所以選擇"結構描述和資料",按下確定。

SNAGHTML1d5fe93

最後選擇要匯出的位置或方式,再按下一步,即可取得語法。

SNAGHTML1d8ac4e

2013年6月10日 星期一

解決Winform輸入法BUG

WinForm在做輸入法切換時常發生錯誤。

Google了一下

寫個FormBase讓視窗繼承:

    #region 解決輸入法BUG     
//解決輸入法BUG
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);
[DllImport("imm32.dll")]
public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);

protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, true);
}
#endregion

private void InitializeComponent()
{
//停用IMEMODE
this.ImeMode = System.Windows.Forms.ImeMode.Off;

}

2013年6月7日 星期五

Sitefinity CMS-Part02

 

安裝好系統後,進入系統內(http://localhost/SitefinityCMS/Sitefinity/)。

系統會要求輸入帳號密碼(系統安裝時設定的管理者帳號密碼)

image

進入後,先看看Pages上的設定。
因為尚未建立任何頁面,所以畫面上出現了大大的Create a Page字樣。

image

設定Page的資訊。

image

設定頁面的版型。
image

若已建立頁面,則會出現管理清單。

Pages

在Actions功能中,可以設定頁面的相關資訊,如設為首頁,新增子頁等。

image

如建立好子頁,架構會如下圖所示,此時便可點擊view預覽。

image

整個系統的網址定義以Company為例(http://localhost/SitefinityCMS/about/company),
是有階層性的。

在此頁面也可以透過拖曳,來建立階層的關係。

image

進入頁面編輯的介面,左方為編輯區,右方為功能區。

加入widget(模組),可將功能區的widget功能拖曳至編輯區。
image

Layout可以讓使用者定義與更換。

image

內容功能區列表:功能很多,彈性很大。

image

image             

編輯完成,選擇publish發佈。

此時輸入(http://localhost/SitefinityCMS/),便可以瀏覽到頁面。

此時若帳號還在登入的狀態時,頁面上可以看到Tools的功能按鍵,裡面可以設定是否顯示編輯按鈕。
這樣就可以在前台瀏覽時,直接點編輯進入修改,不須進入後台。

SNAGHTML14cc538

在後台頁籤中,Content頁籤主要就是在建立模組的內容,在此以新聞Content為例。

image

建立新聞的內容。

image

建立完成後,在後台加入News模組,就可以簡單的預覽到剛剛建立好的新聞。

image

而新聞模組也可以再設定顯示的條件,設定上面很有彈性。

image