C# 如何在gridview中触发LinkButton的单击事件并在asp.net中显示弹出窗口

C# 如何在gridview中触发LinkButton的单击事件并在asp.net中显示弹出窗口,c#,asp.net,gridview,C#,Asp.net,Gridview,我试图通过代码隐藏,使用asp.net中的模板字段,基于数据源构建一个带有动态列的gridview 为此,为了实现,我们开发了一个类DynamicTemplate,它实现了ITemplate接口。在该模板字段中,我在每个单元格中插入了LinkButton,当我单击该单元格链接按钮时,我需要显示一个带有选定单元格值的弹出窗口 为此,我创建了一个Default.asxp页面,并编写了以下内容 public partial class Default : System.Web.UI.Page

我试图通过代码隐藏,使用asp.net中的模板字段,基于数据源构建一个带有动态列的gridview

为此,为了实现,我们开发了一个类
DynamicTemplate
,它实现了
ITemplate
接口。在该模板字段中,我在每个单元格中插入了
LinkButton
,当我单击该单元格链接按钮时,我需要显示一个带有选定单元格值的弹出窗口

为此,我创建了一个Default.asxp页面,并编写了以下内容

  public partial class Default : System.Web.UI.Page
    {
        DataTable dt;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                GenateGridView();

        }

        private void GenateGridView()
        {
            TemplateField tempField;
            DynamicTemplate dynTempItem;
            LinkButton lnkButton;
            Label label;

            GridView gvDynamicArticle = new GridView();

            gvDynamicArticle.Width = Unit.Pixel(500);
            gvDynamicArticle.BorderWidth = Unit.Pixel(0);
            gvDynamicArticle.Caption = "<div>Default Grid</div>";
            gvDynamicArticle.AutoGenerateColumns = false;

            DataTable data = getBindingData();

            for (int i = 0; i < data.Columns.Count; i++)
            {
                tempField = new TemplateField();
                dynTempItem = new DynamicTemplate(ListItemType.AlternatingItem);

                lnkButton = new LinkButton();

                lnkButton.ID = string.Format("lnkButton{0}", i);
                lnkButton.Visible = true;

                string ColumnValue = data.Columns[i].ColumnName;
                tempField.HeaderText = ColumnValue;

                if (ColumnValue == "EmpName")
                {
                    label = new Label();

                    label.ID = string.Format("Label{0}", i);
                    dynTempItem.AddControl(label, "Text", ColumnValue);
                    label.Width = 100;
                }
                else
                {
                    dynTempItem.AddControl(lnkButton, "Text", ColumnValue);
                    lnkButton.Click += lnkButton_Click;
                }
                tempField.ItemTemplate = dynTempItem;
                gvDynamicArticle.Columns.Add(tempField);
                //////grdUserPivotDateTwo.Columns.Add(tempField);
            }

            gvDynamicArticle.DataSource = data;
            gvDynamicArticle.DataBind();

            divContainer.Controls.Add(gvDynamicArticle);

        }

        void lnkButton_Click(object sender, EventArgs e)
        {
            // showing cell values in popUp here.. 
            ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('cell clicked')");
        }


        private DataTable getBindingData()
        {
            dt = new DataTable();
            dt.Columns.Add(new DataColumn("EmpName"));
            dt.Columns.Add(new DataColumn("Monday"));
            dt.Columns.Add(new DataColumn("TuesDay"));
            dt.Columns.Add(new DataColumn("WednesDay"));
            dt.Columns.Add(new DataColumn("ThursDay"));

            dt.Rows.Add("EmpOne", "p", "p", "p", "a");
            dt.Rows.Add("EmpTwo", "p", "a", "p", "p");
            dt.Rows.Add("EmpThree", "p", "p", "p", "a");
            dt.Rows.Add("EmpFour", "p", "a", "p", "p");
            dt.Rows.Add("EmpFive", "p", "p", "p", "a");
            dt.Rows.Add("EmpSix", "a", "p", "p", "p");

            return dt;

        }



    }
在这里,
gridview
中显示的数据很好。这里当我点击链接按钮时,问题是,页面重新加载,回发后没有显示网格

第二个问题是,对于
LinkButton
而言,
单击事件未触发


当我们单击gridview的链接按钮时,请向我提供显示模式窗口的帮助完整信息/示例。

您需要使用ajax模型弹出窗口扩展程序

设计一个包含您的字段的面板,并使用model popup expender显示该弹出窗口

这个链接有它的示例

www.asp.net/ajaxlibrary/ajaxcontroltoolkitsamplesite/modalpopp/modalpopp.aspx

然后在链接按钮中单击 您必须使用show方法打开弹出窗口

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            GenateGridView();

    }
此代码仅在gridview不是回发时生成,但当您单击链接按钮时,会发生回发,这就是为什么当您单击链接按钮时gridview不会再次显示的原因

添加以下代码(if代码中包含的其他部分)以在单击LNK按钮时显示gridview

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            GenateGridView();
        else
        {
            string ctrlName = Request.Params.Get("__EVENTTARGET").Trim();

            if (!String.IsNullOrEmpty(ctrlName))
            {
                if (ctrlName.StartsWith("lnkButton"))
                {
                    GenateGridView();
                }
            }

        }

    }

对于Gridview上的linkbutton使用CommandName属性,在代码文件中为其指定一个特定的名称,并在Gridview的RowCommand事件中准确地使用它,这将是一个很好的选择,如下例所示:

首先是.aspx文件:

    <div>
        <asp:GridView ID="GridViewStudents" runat="server" AutoGenerateColumns="False" OnRowCommand="GridViewStudents_RowCommand">
            <Columns>
                <asp:TemplateField HeaderText="Stud_ID" Visible="False">
                    <ItemTemplate>
                        <asp:Label ID="LabelStudID" runat="server" Text='<%# Eval("Stud_ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="FKFather_ID" Visible="False">
                    <ItemTemplate>
                        <asp:Label ID="LabelFkFatherID" runat="server" Text='<%# Eval("Fk_Father_ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Student Name">
                    <ItemTemplate>
                        <asp:Label ID="LabelStudName" runat="server" Text='<%# Eval("Stud_Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Class Name">
                    <ItemTemplate>
                        <asp:Label ID="LabelRowlevelName" runat="server" Text='<%# Eval("Stud_Level_Row_Name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Delete">
                    <ItemTemplate>
                        <asp:ImageButton ID="ImageButtonDelete" runat="server" CommandArgument='<%# Eval("Stud_ID") %>' CommandName="Remove" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>

<div style="direction: ltr">
    <asp:Panel ID="Panel1" runat="server" Visible="false">
        <asp:Label ID="Labelpopupmessage" runat="server" Text=""></asp:Label>
        <br />
        <asp:Button ID="Buttonaccept" runat="server" Text="نعم" OnClick="Buttonaccept_Click" />
        <asp:Button ID="Buttoncancel" runat="server" Text="لا" OnClick="Buttoncancel_Click" />
    </asp:Panel>
    <asp:HiddenField ID="HiddenField1" runat="server" />
    <asp:ModalPopupExtender runat="server" ID="ModalPopupExtenderStudent" PopupControlID="ButtonSubmit" TargetControlID="HiddenField1" CancelControlID="Buttoncancel">
    </asp:ModalPopupExtender>
</div>
        protected void GridViewStudents_RowCommand(object sender, GridViewCommandEventArgs e)
                {
                    if (e.CommandName == "Remove")
                    {
                       // I stored the ID of the selected Student I want to delete in a viewstate.
                                    ViewState.Add("DeletedStudDetailID",Convert.ToInt32(e.CommandArgument));
 ModalpopupExtender.Show();
                    }

                 }

// Here in the accept delete button I used that code ..
        protected void Buttonaccept_Click(object sender, EventArgs e)
        {
            try
            {
                if (ViewState["DeletedStudDetailID"] != null)
                {
                    StudentDetail StudDet = Data.StudentDetails.Single(SD => SD.Fk_Stud_ID == Convert.ToInt32(ViewState["DeletedStudDetailID"]));
                    Data.StudentDetails.DeleteOnSubmit(StudDet);
                    Student Stud = Data.Students.Single(S => S.Stud_ID == Convert.ToInt32(ViewState["DeletedStudDetailID"]));
                    Data.Students.DeleteOnSubmit(Stud);
                    Data.SubmitChanges();
                }
                this.ResultMessage = "Delete Done Sucessfully !!";
            }
            catch
            {
                this.ErrorMessage = "Delete operation disordered !!";
            }
            finally
            {
                ModalPopExtender.Hide();
            }

        }

我希望它对您的问题有所帮助,并祝您一天快乐:)

首先,调用
GenateGridView
方法时将创建GridView,因此每次回发时都必须调用此方法,然后页面加载应该是

protected void Page_Load(object sender, EventArgs e)
{
   GenateGridView();
}
其次,我将介绍另一种将LinkButton动态添加到GridView的方法。 我修改了您的GenateGridView以仅将标签添加到DynamicTemplate,还添加了这一行
gvdynamiccarticle.rowdabund+=新的GridViewRowEventHandler(gvdynamiccarle\u rowdabund)以处理添加链接按钮

private void GenateGridView()
{
    TemplateField tempField;
    DynamicTemplate dynTempItem;
    Label label;

    GridView gvDynamicArticle = new GridView();

    gvDynamicArticle.Width = Unit.Pixel(500);
    gvDynamicArticle.BorderWidth = Unit.Pixel(0);
    gvDynamicArticle.Caption = "<div>Default Grid</div>";
    gvDynamicArticle.AutoGenerateColumns = false;
    gvDynamicArticle.RowDataBound += new GridViewRowEventHandler(gvDynamicArticle_RowDataBound);
    DataTable data = getBindingData();

    for (int i = 0; i < data.Columns.Count; i++)
    {
        tempField = new TemplateField();
        dynTempItem = new DynamicTemplate(ListItemType.AlternatingItem);

        string ColumnValue = data.Columns[i].ColumnName;
        tempField.HeaderText = ColumnValue;

        label = new Label();

        label.ID = string.Format("Label{0}", i);
        dynTempItem.AddControl(label, "Text", ColumnValue);
        label.Width = 100;

        tempField.ItemTemplate = dynTempItem;
        gvDynamicArticle.Columns.Add(tempField);
    }

    gvDynamicArticle.DataSource = data;
    gvDynamicArticle.DataBind();

    divContainer.Controls.Add(gvDynamicArticle);
}

为什么要在代码背后执行GUI?这不应该在声明性的.aspx页面上完成吗?另外,让客户端发生的逻辑(如打开弹出窗口)完全用JavaScript完成也是一个好主意,因为它不需要涉及服务器端交互。列是根据条件生成的,要显示的列数可能会有所不同。在一些更改之后,我需要保存弹出窗口的值。这就是为什么我尝试使用服务器端事件。使用弹出窗口显示方法,因为此处正在发生页面回发。主要问题是在尝试显示弹出窗口之前,没有显示弹出窗口,当我单击gridview的linkbutton时,它会重新加载到新页面,并且不会触发click事件。谢谢你的代码,我使用了上面的代码,但是这里(ctrlName.StartsWith(“lnkButton”))总是返回“false”,所以“GenarateGridView”方法没有调用并显示空页面谢谢你的示例,但在这里,我需要动态构建模板字段,根据员工计时显示一个月内除节假日以外的所有日期。这就是为什么我使用带有模板的运行时gridview。
private void GenateGridView()
{
    TemplateField tempField;
    DynamicTemplate dynTempItem;
    Label label;

    GridView gvDynamicArticle = new GridView();

    gvDynamicArticle.Width = Unit.Pixel(500);
    gvDynamicArticle.BorderWidth = Unit.Pixel(0);
    gvDynamicArticle.Caption = "<div>Default Grid</div>";
    gvDynamicArticle.AutoGenerateColumns = false;
    gvDynamicArticle.RowDataBound += new GridViewRowEventHandler(gvDynamicArticle_RowDataBound);
    DataTable data = getBindingData();

    for (int i = 0; i < data.Columns.Count; i++)
    {
        tempField = new TemplateField();
        dynTempItem = new DynamicTemplate(ListItemType.AlternatingItem);

        string ColumnValue = data.Columns[i].ColumnName;
        tempField.HeaderText = ColumnValue;

        label = new Label();

        label.ID = string.Format("Label{0}", i);
        dynTempItem.AddControl(label, "Text", ColumnValue);
        label.Width = 100;

        tempField.ItemTemplate = dynTempItem;
        gvDynamicArticle.Columns.Add(tempField);
    }

    gvDynamicArticle.DataSource = data;
    gvDynamicArticle.DataBind();

    divContainer.Controls.Add(gvDynamicArticle);
}
protected void gvDynamicArticle_RowDataBound(object sender, GridViewRowEventArgs e) 
{
    for (int j = 1; j < e.Row.Cells.Count; j++)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton lnkButton = new LinkButton();
            lnkButton.ID = string.Format("lnkButton{0}{1}", e.Row.DataItemIndex, j);
            lnkButton.Click += new EventHandler(lnkButton_Click);

            Label tempLabel = e.Row.FindControl("Label" + j) as Label;
            lnkButton.Text = tempLabel.Text;
            lnkButton.CommandArgument = tempLabel.Text;

            tempLabel.Visible = false;

            e.Row.Cells[j].Controls.Add(lnkButton);
        }
    }
}
public void lnkButton_Click(object sender, EventArgs e)
{
    // showing cell values in popUp here.. 
    LinkButton lnk = (LinkButton)sender;
    ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('cell clicked, value " + lnk.CommandArgument + "')", true);
}