我正在处理GridView中的ButtonField列,该列的RowCommand处理程序不会在以下生命周期中触发。

这是Web上的一个常见问题,this SO帖子帮助我了解到,这是由网页的前一个实例和新实例的控件树中控件ID的差异引起的。

剩下的东西:在Button_Click EventHandler中,在实例将被销毁之前,我需要将gridField的ButtonField的ID保存(进入Session),然后将其传递给EventHandler,如下所示:

    protected GridView Create_GV(DataTable BetTable)
    {
        GridView GV = new GridView
        {
            DataSource = BetTable,
            HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center
        };

        GV.Columns.Add(new ButtonField { Text = "+", CommandName = "Select" });
        GV.DataBind();
        GV.RowCommand += GV_RowCommand;

        //cycle the columns so that the buttonfield is the last one

        int ncol = BetTable.Columns.Count;
        for (int i = 0; i < ncol; i++) GV.HeaderRow.Cells[i].Text = GV.HeaderRow.Cells[i + 1].Text;
        GV.HeaderRow.Cells[ncol].Text = "Přidat";

        foreach (GridViewRow row in GV.Rows)
        {
            List<TableCell> columns = new List<TableCell>();
            foreach (DataControlField column in GV.Columns)
            {
                TableCell cell = row.Cells[0];
                row.Cells.Remove(cell);
                columns.Add(cell);
            }
            row.Cells.AddRange(columns.ToArray());
        }
        return GV;
    }


然后在Page_Init中,我需要重新创建GridView,并将ButtonField的ID重置为原始值。

我故意说出ButtonField的ID,因为我什至不知道是否存在一个或多个-无法找到。

如何获取/设置GridView的ButtonField ID?

最佳答案

您需要在代码中进行一些更改才能使它们正常工作。
尝试的荣誉。你快到了


您的行命令事件处理程序应在数据绑定之前添加
呼叫。
将按钮字段的循环代码移到
行创建事件
仅通过放置一个存在来创建网格的一个实例
在初始化datagridview时检查。


我使用ArrayList创建了一个示例工作解决方案。下载示例here
并对其进行修改以满足您的需求。

Aspx.cs

 using System.Collections.Generic;

 namespace WebApplication3
            {
public partial class WebForm1 : System.Web.UI.Page
{
    GridView GV = null;
    protected void Page_Load(object sender, EventArgs e)
    {

        //Dummy datasource
        ArrayList names = new ArrayList() { };
        names.Add(new Person { Age = 29, Name = "Abide", Surname = "Masaraure" });
        names.Add(new Person { Age = 28, Name = "Lopi", Surname = "Sewa" });
        Create_GV(names);


    }

    protected void Create_GV(ArrayList BetTable)
    {
        if (GV == null)
        {
            GV = new GridView
            {
                DataSource = BetTable,
                HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center
            };

            GV.DataSource = BetTable;
            GV.Columns.Add(new ButtonField { Text = "+", CommandName = "Select" });

            GV.RowCommand += GV_RowCommand;
            GV.RowCreated += GV_RowCreated;

            GV.DataBind();
            GV.HeaderRow.Cells[BetTable.Capacity-1].Text = "Přidat";
            form1.Controls.Add(GV);
        }
    }



    protected void GV_RowCommand(object sender, GridViewCommandEventArgs e)
    {
          //this will fire
    }


    protected void GV_RowCreated(object sender, GridViewRowEventArgs e)
    {

        GridViewRow row = e.Row;
        // Intitialize TableCell list
        List<TableCell> columns = new List<TableCell>();
        foreach (DataControlField column in GV.Columns)
        {
            //Get the first Cell /Column
            TableCell cell = row.Cells[0];
            // Then Remove it after
            row.Cells.Remove(cell);
            //And Add it to the List Collections
            columns.Add(cell);
        }

        // Add cells
        row.Cells.AddRange(columns.ToArray());
    }


      }

class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}
        }


标记

<html>
    <head runat="server">
    <title></title>
   </head>
      <body>
    <form id="form1" runat="server">
    <div>


    </div>
    </form>
   </body>
    </html>


您可能还考虑在标记上放置一个空的网格视图,这将节省您尝试手动创建网格的工作量,并且使连接事件处理程序更加容易。

关于c# - 如何访问GridView ButtonField控件ID?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30325974/

10-09 22:05