1

Ok The problem is I have a grid that I need to have paging on it with pages shown as numbers I want to add two link button to the paging section to alow user to navigate to next page prev page Here is my code

protected void CustomerGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
    var grid = sender  as GridView
    if (e.Row.RowType == DataControlRowType.Pager)
    {
        var prvLink = new LinkButton();
        prvLink.Text = "<";
        prvLink.CommandName = "Page";
        prvLink.CommandArgument = "Prev";
        prvLink.EnableViewState = true;
        var nextLink = new LinkButton();
        nextLink.Text = ">";
        nextLink.CommandName = "Page";
        nextLink.CommandArgument = "Next";
        nextLink.EnableViewState = true;
        var prvCell = new TableCell();
        var nextCell = new TableCell();
        prvCell.Controls.Add(prvLink);
        nextCell.Controls.Add(nextLink);
        Table pagerTable = e.Row.Controls[0].Controls[0] as Table;
        TableRow row = pagerTable.Rows[0];
        row.Cells.AddAt(0, prvCell);
        row.Cells.AddAt(row.Cells.Count, nextCell);
        if (grid.PageIndex == 0)
        {
            prvCell.Enabled = false;
        }
        if (grid.PageIndex == grid.PageCount - 1)
        {
            nextCell.Enabled = false;
        }
    }
}

its perfectly working and users are able to navigate back and forward (and I can see grid RowCommand event getting fired)

The problem is I do not want to put the code inside my page (to make my page tiny and put the responsibility to an other class )

here is my class

public class GridStyler
{
    private GridView _grid;
    public GridStyler(GridView grid)
    {
        _grid = grid;
    }

    public void AddNextPreviousOnPager()
    {
        _grid.RowCreated += _grid_RowCreated;
    }

    void _grid_RowCreated(object sender, GridViewRowEventArgs e)
    {
        var grid = sender as GridView;
        if (e.Row.RowType == DataControlRowType.Pager)
        {
            var prvLink = new LinkButton();
            prvLink.Text = "<";
            prvLink.CommandName = "Page";
            prvLink.CommandArgument = "Prev";
            prvLink.EnableViewState = true;
            var nextLink = new LinkButton();
            nextLink.Text = ">";
            nextLink.CommandName = "Page";
            nextLink.CommandArgument = "Next";
            nextLink.EnableViewState = true;

            var prvCell = new TableCell();
            var nextCell = new TableCell();
            prvCell.Controls.Add(prvLink);
            nextCell.Controls.Add(nextLink);
            Table pagerTable = e.Row.Controls[0].Controls[0] as Table;
            TableRow row = pagerTable.Rows[0];
            row.Cells.AddAt(0, prvCell);
            row.Cells.AddAt(row.Cells.Count, nextCell);
            if (grid.PageIndex == 0)
            {
                prvCell.Enabled = false;
            }
            if (grid.PageIndex == grid.PageCount - 1)
            {
                nextCell.Enabled = false;
            }
        }
    }

}

then I should be able to call a code like that in my page load and it should create the link buttons and response to click of them

var g = new GridStyler(CustomerGridView);
g.AddNextPreviousOnPager();

what happens is the link buttons are created just fine but when user clicks them page get refreshed but RowCommand never get fired (they get fired of course when user clicks other buttons but not this two dynamically created buttons)

Any suggestion is really appreciated

4

0 回答 0