2015-04-09 5 views
0

Это мой контроль, который работает на моей странице ASPX:ViewState данные не сохраняются

%@ 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> 

На Page_Load из HostControl я установить:

ViewState["searchParams"] = "test"; 

После того, как пользователь нажимает ExportToExcel, он вызывает метод GetDataToExport от HostControl:

private DataTable GetDataToExport(out int[] columnsIndexes) 
    { 
     ViewState["searchParams"] -> null 
    } 

Я не понимаю, почему это нуль, и как я могу это сделать в противном случае/Когда я положил Session InstEd из ViewState это работает, но это не logicly правильно.

ответ

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); 
     } 
    } 
0

Это нуль, потому что ViewState является уникальным для каждого элемента управления, так как только ViewState переменная инициализируется в одном элементе управления не может быть доступна в другой (даже внутренне он защищен модификатором доступа). Для обмена данными между элементами управления, которые вы можете использовать, как и вы, переменная сеанса. Но при этом вы определяете его как глобальную переменную, и это не очень приятно. Таким образом, чтобы сделать это красиво, то «объектно-ориентированный путь», вы можете создать публичный метод в борьбе с DataGridView, где инициализации ViewState["searchParams"] переменная:

public void SetSearchParameters(string searchParams) 
{ 
    ViewState["searchParams"] = searchParams; 
} 

Тогда в размещении управления в HostsControl (в методе Page_Load) просто позвоните:

dtbl.SetSearchParameters(mySearchParam); 
0

После наследования, Добавить EnableViewState="true" и попробуйте.

, например

Control Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="...." EnableViewState="true" 
Смежные вопросы