none
一个static引起的错误,求解 RRS feed

  • 问题

  • 先贴代码:

     

    public partial class BackGround_CheckInfo : System.Web.UI.Page
    {
        Operation operation = new Operation();//业务层对象
        static string infoType = ""; //信息类型
        static int checkType = -1;//3这种类别:-1显示全部,0显示未审核信息,1显示审核信息
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                infoType = Request.QueryString["id"].ToString();
            }
            GridViewBind(infoType);
           
        }
        private void GridViewBind(string type)
        {
    
    
    
            GridView1.DataSource = operation.SelectInfo(type);
            GridView1.DataKeyNames = new string[] { "ID" };
            GridView1.DataBind();
            lbPageSum.Text = "当前页" + (GridView1.PageIndex + 1) + "/" + GridView1.PageCount + " 页";
        }
    //......(不重要部分省略)
        protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            string id = GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();
            operation.UpdateInfo(id, infoType);
            switch (checkType)
            {
                case -1:
                    GridViewBind(infoType);
                    GridView1.DataBind();
                    break;
                case 1:
                    GridViewBind(infoType, true);
                    GridView1.DataBind();
                    break;
                case 0:
                    GridViewBind(infoType, false);
                    GridView1.DataBind();
                    break;
            }
        }

    前台代码

    <asp:GridView 
                            ID="GridView1" runat="server" AllowPaging="True" 
                            AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" 
                            GridLines="None" Height="65px" PageSize="24" Width="815px" 
                            onprerender="Page_Load" onrowdatabound="GridView1_RowDataBound" 
                            onselectedindexchanging="GridView1_SelectedIndexChanging" 
                            DataKeyNames="ID" >
                            <RowStyle BackColor="#E3EAEB" />
                            <Columns>
                                <asp:BoundField HeaderText="信息类型" DataField="type" />
                                <asp:BoundField HeaderText="信息标题" DataField="title" />
                                <asp:BoundField HeaderText="信息内容" DataField="info" />
                                <asp:BoundField HeaderText="联系人" DataField="linkman" />
                                <asp:BoundField HeaderText="联系电话" DataField="tel" />
                                <asp:BoundField HeaderText="审核状态" DataField="checkState" />
                                <asp:CommandField  SelectText="通过/取消" ShowSelectButton="True" />
                                <asp:CommandField DeleteText="详细信息"  ShowDeleteButton="True" />
    
                                <asp:BoundField DataField="ID" HeaderText="ID" />
    
                            </Columns>
                            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                            <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
                            <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
                            <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                            <EditRowStyle BackColor="#7C6F57" />
                            <AlternatingRowStyle BackColor="White" />
                        </asp:GridView>

    纠结的问题是,后台代码中的static string infoType这句,如果把infoType设为静变量程序顺利执行,但不加static时就会报错:

    索引超出范围。必须为非负值并小于集合大小。
    参数名: index

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

    异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
    参数名: index

    源错误: 

    行 86:     protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    行 87:     {
    行 88:         string id = GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();
    行 89:         operation.UpdateInfo(id, infoType);
    行 90:         switch (checkType)


    源文件: f:\SIS\BackGround\CheckInfo.aspx.cs    行: 88 

    这个是为什么啊,求大牛.....

     

    2011年11月12日 2:21

答案

  • 你好。

    根据你所描述的情况——因为你初始化这个infoType是在if(!IsPostBack){……}中的。意味着只有第一次打开IE的时候infoType被初始化。如果你用static的话以后该变量将永远记住这个值;否则的话,每次页面提交或者刷新整个Page类被重新创建,这个变量自然也就重新创建了。因为是提交,所以无法进入if块,那么infoType也就无法初始化(为空)。恐怕GridView无法根据这个情况得到数据,继而引发后面的错误。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年11月12日 3:45

全部回复

  • 你好。

    根据你所描述的情况——因为你初始化这个infoType是在if(!IsPostBack){……}中的。意味着只有第一次打开IE的时候infoType被初始化。如果你用static的话以后该变量将永远记住这个值;否则的话,每次页面提交或者刷新整个Page类被重新创建,这个变量自然也就重新创建了。因为是提交,所以无法进入if块,那么infoType也就无法初始化(为空)。恐怕GridView无法根据这个情况得到数据,继而引发后面的错误。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2011年11月12日 3:45
  • 估计是这样,我试了试在触发GridView1_SelectedIndexChanging之前把数据库关了,然后程序就出错了,可能是再触发GridView1_SelectedIndexChanging之后又重新绑定了一次数据
    2011年11月12日 8:23