动态添加gridview的链接按钮不起作用

时间:2015-01-04 11:37:51

标签: c# asp.net gridview

我有一个动态创建列的gridview。

现在所有数据都显示在各自的位置,但我无法让我的链接按钮工作。 (Gridview消失)

这是我的后端代码,使用的gridview只是一个空的gridview

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack)
    {
        TemplateField tfield = new TemplateField();
        tfield.HeaderText = "View";
        GridView1.Columns.Add(tfield);
    }
    GridView1.DataBind();
}

string selectedID = null;
private void BindGrid(List<string> SelectedInfo)
{
    DataTable dt = new DataTable();

    //Dynamically adding columns and setting first column added as ID
    selectedID = SelectedInfo[0];
    for (int i = 0; i < SelectedInfo.Count; i++)
    {
        dt.Columns.Add(new DataColumn(SelectedInfo[i], typeof(string)));
    }

    List<string[]> InfoList = getInfoList(SelectedInfo);

    for (int i = 0; i < InfoList.Count; i++)
    {
        dt.Rows.Add(InfoList[i]);
    }

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

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {   //Adding link button to first column
        LinkButton lnkView = new LinkButton();
        lnkView.ID = "lnkView";
        lnkView.Text = "View";
        lnkView.Click += ViewDetails;
        lnkView.CommandArgument = (e.Row.DataItem as DataRowView).Row[selectedID].ToString();
        e.Row.Cells[0].Controls.Add(lnkView);
    }
}

protected void ViewDetails(object sender, EventArgs e)
{
    //Popup the selected row ID
    LinkButton lnkView = (sender as LinkButton);
    GridViewRow row = (lnkView.NamingContainer as GridViewRow);
    string id = lnkView.CommandArgument;
    ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Row ID" + id + "')", true);
}

protected void CheckBoxList2_SelectedIndexChanged(object sender, EventArgs e)
{
    List<string> SelectedInfo = new List<string>();
    for (int i = 0; i < CheckBoxList2.Items.Count; i++)
    {
        if (CheckBoxList2.Items[i].Selected)
        {
            SelectedInfo.Add(CheckBoxList2.Items[i].Text);
        }
    }

    BindGrid(SelectedInfo);
}

2 个答案:

答案 0 :(得分:0)

如果需要在运行时创建控件,最好使用RowCreated事件:

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {   //Adding link button to first column
        LinkButton lnkView = new LinkButton();
        lnkView.ID = "lnkView";
        lnkView.Text = "View";
        lnkView.Click += ViewDetails;
        lnkView.CommandArgument = (e.Row.DataItem as DataRowView).Row[selectedID].ToString();
        e.Row.Cells[0].Controls.Add(lnkView);
    }
}

否则,您必须在{Ddail GridView事件的每个回发中绑定Page_Load

无论如何,如果你的GridView消失,那只是因为你必须在ViewDetails方法中再次绑定它。

答案 1 :(得分:0)

我希望下面的代码可以帮到你。

                     protected void Page_Load(object sender, EventArgs e)
                            {
                                if (!this.IsPostBack)
                                {
                                    TemplateField tfield = new TemplateField();
                                    tfield.HeaderText = "View";
                                    GridView1.Columns.Add(tfield);
                                }
                                this.BindGrid();
                            }
                            private void BindGrid()
                            {
                                DataTable dt = new DataTable();
                                dt.Columns.AddRange(new DataColumn[2] { new DataColumn("Id", typeof(int)),
                                            new DataColumn("Name", typeof(string))  });
                                dt.Rows.Add(1, "A");
                                dt.Rows.Add(2, "B");

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

                            protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
                            {
                                if (e.Row.RowType == DataControlRowType.DataRow)
                                {
                                    LinkButton lnkView = new LinkButton();
                                    lnkView.ID = "lnkView";
                                    lnkView.Text = "View";
                                    lnkView.Click += ViewDetails;
                                    lnkView.CommandArgument = (e.Row.DataItem as DataRowView).Row["Id"].ToString();
                                    e.Row.Cells[2].Controls.Add(lnkView);
                                }
                            }

                            protected void ViewDetails(object sender, EventArgs e)
                            {
                                LinkButton lnkView = (sender as LinkButton);
                                GridViewRow row = (lnkView.NamingContainer as GridViewRow);
                                string id = lnkView.CommandArgument;
                                ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Id: " + id + "')", true);
                            }