这是我在我的aspx页面上运行的Control:
%@ Control Language="C#" AutoEventWireup="true" CodeBehind="HostsControl.ascx.cs" Inherits="ClientFrontEnd.HostsControl" %>
<%@ Register Src="~/UserControls/DataGridView.ascx" TagPrefix="dtbl" TagName="DataGridView" %>
<dtbl:DataGridView runat="server" id="tbl" />
它使用另一个控件:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="DataGridView.ascx.cs" Inherits="ClientFrontEnd.UserControls.DataGridView" %>
<asp:UpdatePanel UpdateMode="Conditional" runat="server" ID="updatePanel">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="imgExportToExcel" EventName="Click" />
<%--<asp:AsyncPostBackTrigger ControlID="imgExportToPDF" EventName="Click" />--%>
</Triggers>
<ContentTemplate>
<asp:UpdateProgress runat="server" ID="upprogress" AssociatedUpdatePanelID="updatePanel" DisplayAfter="0">
<ProgressTemplate>
<div style="position: fixed; text-align: center; height: 100%; width: 100%; top: 0; right: 0; left: 0; z-index: 9999999; background-color: #000000; opacity: 0.7;">
<asp:Image ID="imgUpdateProgress" runat="server" ImageUrl="~/images/iguloader-yashar.gif" AlternateText="Loading ..." ToolTip="Loading ..." Style="padding: 10px; position: fixed; top: 45%; left: 50%;" />
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:PlaceHolder runat="server" ID="exportControls">
<div id="div_export_images" style="text-align:right;">
<asp:ImageButton ID="imgExportToExcel" ImageUrl="~/images/files/excel.png" ToolTip="Export to excel" AlternateText="Excel" OnClick="ExportToExcel" runat="server" />
<asp:ImageButton ID="imgExportToPDF" ImageUrl="~/images/files/pdf.png" ToolTip="Export to pdf" AlternateText="PDF" OnClick="ExportToPDF" runat="server" />
</div>
</asp:PlaceHolder>
<asp:Table runat="server" ID="table" CssClass="dataTable cell-border <%=CssClass%>" Width="100%" />
</ContentTemplate>
</asp:UpdatePanel>
在HostControl的Page_Load上设置:
ViewState["searchParams"] = "test";
用户点击ExportToExcel
后,它会从HostControl调用方法GetDataToExport
:
private DataTable GetDataToExport(out int[] columnsIndexes)
{
ViewState["searchParams"] -> null
}
我不明白为什么它是null而且我怎么能这样做呢?当我把Session的insted放入它时它起作用,但它不是逻辑正确的。
答案 0 :(得分:0)
DataTable dt = new DataTable();
ViewState["searchParams"] = dt;
DataTable dt2 = (DataTable)ViewState["searchParams"];
您可以先存储,然后再进行访问。同样在IsPostBack
中,您应该调用它。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetDataToExport(out int[] columnsIndexes);
}
}
答案 1 :(得分:0)
它是null,因为ViewState对于每个控件都是唯一的,所以一旦在一个控件中初始化ViewState变量,就不能在另一个控件中访问它(甚至在内部它具有受保护的访问修饰符)。要在控件之间共享数据,您可以像使用的那样使用会话变量。但这样做你将它定义为一个全局变量,这不是很好。所以为了做到这一点,“面向对象的方式”,您可以在DataGridView控件中创建公共方法,在其中初始化ViewState["searchParams"]
变量:
public void SetSearchParameters(string searchParams)
{
ViewState["searchParams"] = searchParams;
}
然后在HostsControl中的主机控件(在Page_Load方法中)中调用:
dtbl.SetSearchParameters(mySearchParam);
答案 2 :(得分:0)
继承后,添加EnableViewState="true"
并尝试。
例如
Control Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="...." EnableViewState="true"