Командный аргумент LinkButton задает значения первой страницы на всех других страницах (разбиение на страницы Gridview) - PullRequest
0 голосов
/ 20 июля 2011

Я использую GridView вместе с пользовательской нумерацией страниц для отображения данных. В одном из столбцов, где я показываю ссылку (linkButton) для удаления записи, я передаю идентификатор записи в бэкэнд-функцию. Я получаю значение командного аргумента правильно для всех записей на странице 1, но со страницы 2 и далее я получаю те же значения, что и страница 1, вместо значений записей страницы 2.

Ниже приведен код ASP

 <form id="form1" runat="server">
<div class="FilterDiv">Page Size:
<asp:DropDownList ID="ddlPageSize" runat="server" AutoPostBack="true" OnSelectedIndexChanged="PageSize_Changed">
<asp:ListItem Text="4" Value="4" />
<asp:ListItem Text="2" Value="2" />
<asp:ListItem Text="1" Value="1" />
</asp:DropDownList>
</div>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" CssClass="standard-table" 
 AllowSorting="true" OnSorting="SortResultBy" OnRowDataBound="GridViewRowEventHandler">
<HeaderStyle CssClass="standard-tableHead" />
  <RowStyle CssClass="standard-tableBody" />
<Columns>
  <asp:BoundField DataField="newscode" HeaderText="News Code" SortExpression="newscode" />
  <asp:BoundField DataField="newstitle" HeaderText="News Title" SortExpression="newstitle" />
  <asp:BoundField DataField="newsdesc" HeaderText="News Description"  ItemStyle-Width="40%" />
  <asp:BoundField DataField="Created" HeaderText="Created Date" SortExpression="Created" />
  <asp:BoundField DataField="status" HeaderText="Status" />
  <asp:TemplateField HeaderText="Actions">
    <ItemTemplate>
     <asp:HyperLink ID="Hyperlink2" runat="server" Text='Details' NavigateUrl='<%# Eval("newsid","newsdetails.aspx?idnews={0}") %>'>
     </asp:HyperLink> &nbsp;
     <asp:HyperLink ID="Hyperlink1" runat="server" Text='Edit' NavigateUrl='<%# Eval("newsid","editnews.aspx?idnews={0}") %>'>
     </asp:HyperLink> &nbsp;
     <asp:LinkButton ID="NewsDeletelink" OnCommand="DeleteNewsbyID" CommandArgument='<%# Eval("newsid") %>' runat="server" EnableViewState="true"> Delete </asp:LinkButton>

    </ItemTemplate>
  </asp:TemplateField>
</Columns>
</asp:GridView>
<div class="pagination">
<asp:Repeater ID="rptPager" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lnkPage" runat="server" Text = '<%#Eval("Text") %>' CommandArgument = '<%# Eval("Value") %>' Enabled = '<%# Eval("Enabled") %>' OnClick = "Page_Changed"></asp:LinkButton>  
</ItemTemplate>
</asp:Repeater>
</div> 

</form>

Записи из базы данных выбираются на основе PageIndex и PageSize из SP, а данные привязываются к gridview, как показано ниже.

SqlCommand myCommand = new SqlCommand("getAllNews", myConnection);
        myCommand.CommandType = CommandType.StoredProcedure;
        myCommand.Parameters.Add("@sortby", SqlDbType.NChar).Value = SortBy;
        myCommand.Parameters.AddWithValue("@PageIndex", pageIndex);
        myCommand.Parameters.AddWithValue("@PageSize", int.Parse(ddlPageSize.SelectedValue));
        myCommand.Parameters.Add("@RecordCount", SqlDbType.Int, 4);
        myCommand.Parameters["@RecordCount"].Direction = ParameterDirection.Output;
        //SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from news order by " + SortValue, myConnection);
        SqlDataAdapter dataAdapter = new SqlDataAdapter(myCommand);
        // create the DataSet
        DataSet dataSet = new DataSet();
        // fill the DataSet using our DataAdapter
        dataAdapter.Fill(dataSet, "news");

        GridView1.DataSource = dataSet;

        GridView1.DataBind();
        int recordCount = Convert.ToInt32(myCommand.Parameters["@RecordCount"].Value);
        this.PopulatePager(recordCount, pageIndex);
protected void GridViewRowEventHandler(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[4].Text == "1")
        {
            e.Row.Cells[4].Text = "<a>Published</a> ";
        }
        else
        {
            e.Row.Cells[4].Text = "<a>Draft</a> ";
        }
        if (e.Row.Cells[2].Text.Length >= 50)
        {
            e.Row.Cells[2].Text = e.Row.Cells[2].Text.Substring(0, 50) + "...";
        }

    }
}

Может ли кто-нибудь разобрать, почему я получаю значения страницы 1 на всех страницах?

1 Ответ

1 голос
/ 31 мая 2012

Я знаю, что это немного устарело, но у меня была похожая проблема.

Чтобы получить правильные данные строки для всех страниц, подключитесь к событию RowDataBound и установите там CommandArgument LinkButton.

...