在类级别声明但在page_load中初始化的变量在button_click事件处理程序中丢失其范围?

时间:2012-02-21 10:11:48

标签: asp.net

我是asp.net的新手..如果马问题太过琐碎,请耐心等待! :)

我在更新面板中使用手风琴控件。我还有一个按钮,可以保存一些手风琴控制的数据! - 此完整版是一个用户控件,在另一个.aspx页面中使用。

现在在用户控件的page_load事件中我初始化我的数据库连接,在将数据加载到手风琴时工作得很好..但是当我点击保存时,在保存按钮中单击偶数处理程序,数据库连接对象始终为null .. !! (即使它在page_load中初始化)请帮助..

.ascx就在这里:

<asp:UpdatePanel ID="PrefPanel" runat="server"  >
  <ContentTemplate>
    <ajaxToolkit:Accordion ID="PrefAccordion" runat="server" HeaderCssClass="accordionHeader" 
        HeaderSelectedCssClass="accordionHeaderSelected"  ContentCssClass="accordionContent" 
        BackColor="#E8EAF7" Height="530px" Width="500px" AutoSize="None" RequireOpenedPane="false"
        BorderStyle="Solid" BorderWidth="1" BorderColor="Black">
        <Panes>

            <ajaxToolkit:AccordionPane ID="ProjCategoryPaneID" runat="server">
                <Header > Project Category</Header>
                <Content> 
                    <asp:Panel ID="ProjCategoryPanel" runat="server" Width="100%">
                        <table align="center" width="100%">
                            <tr></tr>
                            <tr>
                                <td align="left">
                                    <asp:CheckBoxList RepeatDirection="Vertical" TextAlign="Left" ID="ProjCategoryItem1" runat="server" AutoPostBack="false" CausesValidation="false" />
                                </td>
                            </tr>
                        </table>
                    </asp:Panel>
                </Content>
            </ajaxToolkit:AccordionPane>
<asp:Button ID="btnSavePref" CssClass="buttonsmall" runat="server" Text="Save" Width="60px" OnClick="btnSavePref_Click"/>
    <asp:Button ID="btnCancelPref" CssClass="buttonsmall" runat="server" Text="Cancel" Width="60px" />
</ContentTemplate>  
</asp:UpdatePanel>

背后的代码如下:

public partial class UserPreferences : System.Web.UI.UserControl
    {
        private EAReportingDAL m_DataAccessLayer = null;

        // Projects Category
        Panel projectCategoryPanel;
        CheckBoxList projectCategoryList;

        protected void Page_Load(object sender, EventArgs e)
        {
            String connectionString = WebConfigurationManager.ConnectionStrings            ["BSCDB"].ConnectionString;
            m_DataAccessLayer = new EAReportingDAL(connectionString);
                            LoadUserPreferences();
         }

        protected void btnSavePref_Click(object sender, EventArgs e)
        {
            string userName = this.Page.User.Identity.Name;
            DataSet availabeData = m_DataAccessLayer.GetUserPreferences(this.Page.User.Identity.Name, Constants.ProjectsUIView);
        }
}

在按钮单击事件处理程序btnSavePref_Click()中,db连接对象m_DataAccessLayer始终为null,但是LoadUserPreferences()中的相同对象[虽然我还没有粘贴在这里]工作正常! PLZ指导我哪里错了或者有人需要更多细节!!

1 个答案:

答案 0 :(得分:0)

我对UpdatePanel机制并不是很熟悉,但是你可能会以绕过Page_Load方法的方式定义它。

我建议移动代码创建数据访问层以分离方法,然后从页面加载和按钮单击处理程序中调用此方法:

private void InitDataAccess()
{
    //ignore if already created
    if (m_DataAccessLayer != null)
        return;
    String connectionString = WebConfigurationManager.ConnectionStrings            ["BSCDB"].ConnectionString;
    m_DataAccessLayer = new EAReportingDAL(connectionString);
    LoadUserPreferences();
}

protected void Page_Load(object sender, EventArgs e)
{
    InitDataAccess();
}

protected void btnSavePref_Click(object sender, EventArgs e)
{
    InitDataAccess();
    string userName = this.Page.User.Identity.Name;
    DataSet availabeData = m_DataAccessLayer.GetUserPreferences(this.Page.User.Identity.Name, Constants.ProjectsUIView);
}