【问题标题】:Link button not firing in dynamic gridview in asp.net链接按钮未在 asp.net 中的动态网格视图中触发
【发布时间】:2014-05-14 05:52:53
【问题描述】:

我有一个带有两个链接按钮的动态网格视图。如果我单击该链接按钮事件不会触发。但是如果我在页面中调用“显示”方法,则加载其工作正常。代码如下

public void display()
    {
       GridView grdv = new GridView();
        grdv.AutoGenerateColumns = false;
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        BL.ESSBL bl = new BL.ESSBL();
        ds = bl.GetContactList();//getting datatable
        if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            dt = ds.Tables[0];
            grdv.RowDataBound += new GridViewRowEventHandler(grdv_RowDataBound);
            grdv.DataSource = null;
            grdv.DataBind();
            grdv.Columns.Clear();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                BoundField boundfield = new BoundField();
                boundfield.DataField = dt.Columns[i].ColumnName.ToString();
                boundfield.HeaderText = dt.Columns[i].ColumnName.ToString();
                grdv.Columns.Add(boundfield);
            }
            TemplateField tmf = new TemplateField();
            grdv.Columns.Add(tmf);
            tmf = new TemplateField();
            grdv.Columns.Add(tmf);
            grdv.DataSource = dt;
            grdv.DataBind();
            pnlupdate.Controls.Add(grdv);
           }
    }
 void grdv_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {    
           int count= e.Row.Cells.Count;
            LinkButton lnkupdate= new LinkButton();
            lnkupdate.ID = "Update";
            lnkupdate.Text = "Update";
            LinkButton lnkdelete = new LinkButton();
            lnkdelete.ID = "delete";
            lnkdelete.Text = "delete";
            lnkdelete.Click += new EventHandler(lnkdelete_Click);
            lnkupdate.CommandArgument = (e.Row.DataItem as DataRowView).Row[0].ToString();
            lnkdelete.CommandArgument = (e.Row.DataItem as DataRowView).Row[0].ToString();
            lnkupdate.Click += new EventHandler(lnkupdate_Click);
            e.Row.Cells[count-2].Controls.Add(lnkupdate);
            e.Row.Cells[count-1].Controls.Add(lnkdelete);

        }
    }
   protected void ddlProcess_SelectedIndexChanged(object sender, EventArgs e)
    {
      dynamicgridview();        // not working
            Clear();
    }

void lnkupdate_Click(object sender, EventArgs e)
    {
        Response.Write(@"<script language=""javascript"">alert(""update details "");</script>");
    }

如果我在页面加载中放置“显示”方法,它将调用每个回发。我不希望这样。我想在下拉选择更改事件中调用此方法。如果我将“显示”方法放入该链接点击事件不会触发。 所以我必须做些什么来克服这个。

【问题讨论】:

  • 您如何加载您的dropdownlist 并显示您的选择更改事件的代码。我认为不处理回发是实际问题。
  • @hassan 我用下拉列表更新了代码。我不想在页面加载中调用显示方法。有没有其他方法可以做到这一点。
  • 好的,你是如何填充ddlProcess的?
  • @HassanNisar 我与 pageload.gridview 中的一个数据表绑定。但如果我单击 gridview 链接按钮不会触发并且它会消失。
  • 所有关于回发的动态控件都需要在其控件树中的相应位置重新创建,以使其回发和视图状态正常工作...

标签: c# asp.net gridview


【解决方案1】:

如果您在回发后不绑定网格,则必须在 Page_Load 之前创建网格视图。 GridView 需要加载 ViewState。

    private GridView gv;
    protected void Page_Init(object sender, EventArgs e)
    {
        gv = new GridView();
        gv.ID = "gv";
        gv.AutoGenerateColumns = false;
        gv.Columns.Add(new TemplateField());
        gv.RowCreated += gv_RowCreated;
        gv.RowDataBound += gv_RowDataBound;
        pnl.Controls.Add(gv);
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            gv.DataSource = new object[] {
                new object()
            };
            gv.DataBind();
        }
    }

    void gv_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        var lb = e.Row.FindControl("Update") as LinkButton;
        lb.CommandArgument = "1";
    }

    void gv_RowCreated(object sender, GridViewRowEventArgs e)
    {
        // If you bind gridview after Page_Init,
        // This event will not be fired after postback.
        LinkButton lb = new LinkButton();
        lb.ID = "Update";
        lb.Text = "Update";
        lb.Click += lb_Click;
        e.Row.Cells[e.Row.Cells.Count - 1].Controls.Add(lb);
    }

    void lb_Click(object sender, EventArgs e)
    {
        var lb = (LinkButton)sender;
        string arg = lb.CommandArgument;
    }

【讨论】:

    【解决方案2】:

    而不是 grdv.Columns.Clear();你可以试试看 grdv.AutoGenerateColumns = false;。因为我不认为你的代码有错误

    【讨论】:

    • 只有它的工作代码。但是如果我们没有在页面加载中调用动态gridview 将消失。有没有其他方法可以保留该gridview。我认为这个链接的bcse 没有触发跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2016-04-13
    相关资源
    最近更新 更多