GridView分页问题

时间:2010-01-31 09:43:26

标签: asp.net gridview

我的一个页面上有一个非常简单的GridView,我的.aspx页面上有以下标记:

<asp:GridView ID="gvNews" runat="server" AutoGenerateColumns="false" AllowPaging="true"
            AllowSorting="true" DataKeyNames="NewsID,VersionStamp" OnPageIndexChanging="gvNews_PageIndexChanging"
            OnRowCreated="gvNews_RowCreated">
            <Columns>
                <asp:BoundField HeaderText="News Title" DataField="NewsTitle"
                    SortExpression="NewsTitle" ReadOnly="true" />
                <asp:BoundField HeaderText="News Content" DataField="NewsContent"
                    SortExpression="NewsContent" ReadOnly="true" />
                <asp:BoundField HeaderText="Posted Date" DataField="InsertedDate"
                    SortExpression="InsertedDate" ReadOnly="True" />
                <asp:BoundField HeaderText="InsertedBy" DataField="InsertedBy" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="lbEdit" runat="server" Text="Edit" CommandName="Select" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

以下是我的.cs页面上的代码:

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadGrid();
            }
        }

        private void LoadGrid()
        {
            gvNews.DataSource = GetNews();
            gvNews.DataBind();
        }


        protected void gvNews_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

        }

        protected void gvNews_RowCreated(object sender, GridViewRowEventArgs e)
        {
            e.Row.Cells[3].Visible = false;
        }

在RowCreated事件中,我试图隐藏gridview中的InsertedBy列。当AllowPaging设置为flase时,此代码可以正常工作。但是当AllowPaging设置为true时,我在RowCreated事件处理程序中收到以下错误:

指定的参数超出了有效值的范围。 参数名称:index

这种行为可能是什么原因?

2 个答案:

答案 0 :(得分:0)

根据您发布的内容,您在RowCreated事件中的硬编码值为3似乎就是问题所在。在页面上启用跟踪,看看你得到了什么。 BTW寻呼机next-&gt; prev链接也会导致回发,而在PageLoad你只是加载网格,如果它不是回传,当你试图去下一页并且创建的行被触发时。

答案 1 :(得分:0)

您需要编写如下代码:

protected void gvNews_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[3].Visible = false;
    }
}

使用GridView,可能会创建不同类型的行,并且它们将具有不同数量的单元格,但RowCreated事件将针对所有行触发,因此在这种情况下,您需要将逻辑限制为仅数据行。