Dear All,
Please help me with asp.net mvc and rdlc report viewer. I have a syncfusion tree view page that contain report name from database and print button. I select the report name from tree view and click the print button to print report. I have report controller, model and view. In Report folder of view folder, I have two cshtml page Index and ReportView. And my ReportViewer.aspx web form and other .rdlc reports are in another folder. Because I don't want to open ReportViewer.aspx web form in Index.cshtml under tree view. So I create ReportView.cshtml. Index page for name of report tree view and ReportView page for ReportViewer.aspx web form. But I don't know how to send report name from tree view to ReportView.cshtml and then from ReportView.cshtml to ReportViewer.aspx web form. I want to switch case in code behind of ReportViewer.aspx with report name. Some code of mine is below. Thank you all friends.
What I have tried:
Here is my ReportController
public ActionResult Index()
{
using (conn)
{
conn.Open();
string query = "Select ReportID, ReportName, IsNull(ParentID, 0) ParentID, IsParent From Report Order By ReportID";
SqlDataAdapter da = new SqlDataAdapter(query, conn);
da.Fill(dt);
conn.Close();
}
List<ReportNameList> reportList = new List<ReportNameList>();
foreach (DataRow rows in dt.Rows)
{
reportList.Add(new ReportNameList { ReportID = Convert.ToInt32(rows["ReportID"]), ParentID = Convert.ToInt32(rows["ParentID"]), ReportName = rows["ReportName"].ToString(), IsParent = Convert.ToBoolean(rows["IsParent"]), Expanded = Convert.ToBoolean(rows["IsParent"]) });
}
ViewBag.DataSource = reportList;
return View();
}
public ActionResult ReportView()
{
return View();
}
Here is my model
public class ReportNameList
{
public int ReportID { get; set; }
public string ReportName { get; set; }
public int ParentID { get; set; }
public bool IsParent { get; set; }
public bool Expanded { get; set; }
}
public class ClaimEnqTmp
{
public DateTime InvDate { get; set; }
public string RegNo { get; set; }
public string ClaimTypeName { get; set; }
public string ClaimantName { get; set; }
public string SupplierName { get; set; }
public string DepotName { get; set; }
public string DeptName { get; set; }
public string CurrencyShort { get; set; }
public int Amount { get; set; }
}
Here is my Index.cshtml.
<div style="border:solid thin; border-color:#ecf0f5">
@(Html.EJ().TreeView("reportTree").TreeViewFields(s => s.Datasource((IEnumerable<ReportNameList>)ViewBag.datasource).Id("ReportID").ParentId("ParentID")
.Text("ReportName").HasChild("IsParent").Expanded("IsParent")))
</div>
<div class="box-footer">
<input type="button" class="btn btn-default" id="btnPrint" style="width:100px" value="Print" onclick="PrintReport()" />
</div>
Here is script in Index.cshtml
<script type="text/javascript">
function PrintReport() {
var treeReportList = $("#reportTree").data('ejTreeView');
var rptName = "";
var selectedNode = treeReportList.getSelectedNode();
rptName = treeReportList.getText($(selectedNode[0]));
var url = '@Url.Action("ReportView", "Report")';
window.location.href = url.replace();
}
</script>
Here is ReportView.cshtml page and I don't know how to get para from Index page and send to ReportViewer.aspx page.
@{
ViewBag.Title = "Report";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<iframe id="myReport" width="100%" height="100%" src="~/Reports/ReportViewer.aspx?ReportName=By%20Date"></iframe>
Here is .cs and html of my ReportViewer.aspx page.
<body>
<form id="formReportViewer" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<rsweb:ReportViewer ID="rvReportViewer" runat="server" Width="100%">
</rsweb:ReportViewer>
</div>
</form>
</body>
Here is code behind of ReportViewer.aspx
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if(Request.QueryString["ReportName"] != null)
{
string reportName = Request.QueryString["ReportName"].ToString();
switch (reportName)
{
case "By Date":
using (conn)
{
conn.Open();
string query = "Select InvDate, RegNo, ClaimTypeName, ClaimantName, SupplierName, DepotName, DeptName, CurrencyShort, Amount From ClaimEnqTmp";
SqlDataAdapter da = new SqlDataAdapter(query, conn);
da.Fill(dt);
conn.Close();
}
List<ClaimEnqTmp> claimEnq = new List<ClaimEnqTmp>();
foreach (DataRow rows in dt.Rows)
{
claimEnq.Add(new ClaimEnqTmp
{
InvDate = Convert.ToDateTime(rows["InvDate"]),
RegNo = rows["RegNo"].ToString(),
ClaimTypeName = rows["ClaimTypeName"].ToString(),
ClaimantName = rows["ClaimantName"].ToString(),
SupplierName = rows["SupplierName"].ToString(),
DepotName = rows["DepotName"].ToString(),
DeptName = rows["DeptName"].ToString(),
CurrencyShort = rows["CurrencyShort"].ToString(),
Amount = Convert.ToInt32(rows["Amount"])
});
}
rvReportViewer.LocalReport.ReportPath = Server.MapPath("~/Reports/rptClaimEnq.rdlc");
rvReportViewer.LocalReport.DataSources.Clear();
ReportDataSource rds = new ReportDataSource("ClaimEnqTmpDataSet", claimEnq);
rvReportViewer.LocalReport.DataSources.Add(rds);
rvReportViewer.LocalReport.Refresh();
rvReportViewer.DataBind();
break;
case a:
break;
case b:
break;
default:
break;
}
}
}
}