asp.net - проблема создания динамического нижнего колонтитула в GridView - PullRequest
0 голосов
/ 22 декабря 2009

Я могу динамически создавать строки BoundFields и Footer, как в моем GridView:

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

        private void CreateGridView()
        {
            GridView1.Columns.Clear();

            DataTable dataTable = Book.GetBooksDataSet().Tables[0];

            CommandField cf = new CommandField();
            cf.ShowEditButton = true;

            GridView1.Columns.Add(cf);

            int colCount = 1;
            foreach (DataColumn c in dataTable.Columns)
            {
                BoundField boundField = new BoundField();

                boundField.DataField = c.ColumnName;
                boundField.HeaderText = c.ColumnName;
                //boundField.FooterText = "---";

                if (colCount == 3 || colCount == 5)
                {
                    boundField.ReadOnly = true;
                }

                GridView1.Columns.Add(boundField);
                colCount++;
            }

            GridView1.ShowFooter = true;

            GridView1.DataSource = dataTable;
            GridView1.DataBind();

            GridViewRow footerRow = GridView1.FooterRow;
            Button b = new Button();
            b.Text = "Add New";
            int i = 0;
            footerRow.Cells[i].Controls.Add(b);
            foreach (DataColumn c in dataTable.Columns)
            {
                ++i;
                TextBox tb = new TextBox();
                footerRow.Cells[i].Controls.Add(tb);
            }
        }
....................................
....................................
....................................
}

Но проблема в том, что когда я нажимаю кнопку «Добавить новый», она мгновенно исчезает. И также я не могу добавить какой-либо обработчик событий к нему. Или перехватить его действия так:

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int index = Convert.ToInt32(e.CommandArgument);

            if (e.CommandName == "Edit")
            {
                GridView1.EditIndex = index;

                GridViewRow selectedRow = ((GridView)e.CommandSource).Rows[index];

                //We can get cell data like this
                string id = selectedRow.Cells[1].Text;
                string isbn = selectedRow.Cells[2].Text;

                //This is necessary to GridView to be showed up.
                CreateGridView();
            }
            else if (e.CommandName == "Update")
            {
                LinkButton updateButton = (LinkButton)e.CommandSource;

                DataControlFieldCell dcfc = (DataControlFieldCell)updateButton.Parent;

                GridViewRow gvr = (GridViewRow)dcfc.Parent;

                //The update...................
                //Update grid-data to database
                UpdateDataInTheDatabase(gvr.Cells[1].Controls);                

                //Grid goes back to normal
                GridView1.EditIndex = -1;

                //This is necessary to GridView to be showed up.
                CreateGridView();
            }
        }

Еще одна вещь, я видел несколько решений, которые предлагают обрабатывать событие GridView rowBound. Но мне нужно сделать это из Page_load обработчика событий или из GridView1_RowCommand обработчика событий.

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

Динамически созданные элементы управления должны быть пересозданы при каждой обратной передаче . Ваша кнопка «Добавить новый» вызывает обратную передачу, поэтому динамически созданный нижний колонтитул исчезает. Есть ли причина, по которой эта сетка должна создаваться динамически? Из кода, который вы разместили, видно, что вы можете сделать это в разметке. Если нет, вам придется заново создавать динамические элементы управления для каждой обратной передачи.

Отредактировано, чтобы добавить: Я немного поиграл с этим, и то, что ниже, работает в том, что сетка не исчезает и события обрабатываются, но на самом деле ничего не делает. Надеюсь, это поможет.

Markup:

    <p><asp:Literal ID="Literal1" runat="server" /></p>
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" 
        OnRowCommand="GridView1_RowCommand" 
        OnRowEditing="GridView1_RowEditing"/>

Код:

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

private DataTable GetBooksDataTable()
{
    var dt = new DataTable();
    dt.Columns.Add("ID", typeof(int));
    dt.Columns.Add("Title", typeof(string));
    dt.Columns.Add("Author", typeof(string));

    for (int index = 0; index < 10; index++)
    {
        dt.Rows.Add(index, "Title" + index, "Author" + index);
    }
    return dt;
}

private void BindGridView()
{
    var dt = GetBooksDataTable();

    GridView1.Columns.Clear();
    GridView1.ShowFooter = true;

    var cf = new CommandField();
    cf.HeaderText = "Action";
    cf.ShowEditButton = true;
    GridView1.Columns.Add(cf);

    for (int index = 0; index < dt.Columns.Count; index++)
    {
        var boundField = new BoundField();
        boundField.DataField = dt.Columns[index].ColumnName;
        boundField.HeaderText = dt.Columns[index].ColumnName;
        GridView1.Columns.Add(boundField);
    }

    GridView1.DataSource = dt;
    GridView1.DataBind();

    var footer = GridView1.FooterRow;
    var b = new LinkButton();
    b.Text = "Add New";
    b.CommandName = "Add New";
    footer.Cells[0].Controls.Add(b);
    for (int index = 1; index < dt.Columns.Count + 1; index++)
    {
        var tb = new TextBox();
        footer.Cells[index].Controls.Add(tb);
    }

}

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
    Literal1.Text = e.CommandName;
}

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    Literal1.Text = "Editing row index " + e.NewEditIndex.ToString();
}
1 голос
/ 24 декабря 2009

Переместите ваш код с Page_Load на Page_Init. Вещи, добавленные в Page_Load, действуют только в течение жизненного цикла одной обратной передачи.

После этого вы сможете добавлять обработчики событий, перехватывать события и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...