如何在grid.net中触发LinkBut​​ton的click事件和在asp.net中显示PopUp窗口

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

为此,为了实现,我们开发了一个实现ITemplate接口的类DynamicTemplate 。 在该模板字段中,我已在每个单元格中插入了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 = "
Default Grid
"; 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; } }

和相应的DynamicTemplate类是

 public class DynamicTemplate : System.Web.UI.ITemplate { System.Web.UI.WebControls.ListItemType templateType; System.Collections.Hashtable htControls = new System.Collections.Hashtable(); System.Collections.Hashtable htBindPropertiesNames = new System.Collections.Hashtable(); System.Collections.Hashtable htBindExpression = new System.Collections.Hashtable(); public DynamicTemplate(System.Web.UI.WebControls.ListItemType type) { templateType = type; } public void AddControl(WebControl wbControl, String BindPropertyName, String BindExpression) { htControls.Add(htControls.Count, wbControl); htBindPropertiesNames.Add(htBindPropertiesNames.Count, BindPropertyName); htBindExpression.Add(htBindExpression.Count, BindExpression); } public void InstantiateIn(System.Web.UI.Control container) { PlaceHolder ph = new PlaceHolder(); for (int i = 0; i < htControls.Count; i++) { //clone control Control cntrl = CloneControl((Control)htControls[i]); switch (templateType) { case ListItemType.Header: break; case ListItemType.Item: ph.Controls.Add(cntrl); break; case ListItemType.AlternatingItem: ph.Controls.Add(cntrl); ph.DataBinding += new EventHandler(Item_DataBinding); break; case ListItemType.Footer: break; } } ph.DataBinding += new EventHandler(Item_DataBinding); container.Controls.Add(ph); } public void Item_DataBinding(object sender, System.EventArgs e) { PlaceHolder ph = (PlaceHolder)sender; GridViewRow ri = (GridViewRow)ph.NamingContainer; for (int i = 0; i  0) { Control tmpCtrl = (Control)htControls[i]; String item1Value = (String)DataBinder.Eval(ri.DataItem, htBindExpression[i].ToString()); Control ctrl = ph.FindControl(tmpCtrl.ID); Type t = ctrl.GetType(); System.Reflection.PropertyInfo pi = t.GetProperty(htBindPropertiesNames[i].ToString()); pi.SetValue(ctrl, item1Value.ToString(), null); } } } private Control CloneControl(System.Web.UI.Control src_ctl) { Type t = src_ctl.GetType(); Object obj = Activator.CreateInstance(t); Control dst_ctl = (Control)obj; PropertyDescriptorCollection src_pdc = TypeDescriptor.GetProperties(src_ctl); PropertyDescriptorCollection dst_pdc = TypeDescriptor.GetProperties(dst_ctl); for (int i = 0; i < src_pdc.Count; i++) { if (src_pdc[i].Attributes.Contains(DesignerSerializationVisibilityAttribute.Content)) { object collection_val = src_pdc[i].GetValue(src_ctl); if ((collection_val is IList) == true) { foreach (object child in (IList)collection_val) { Control new_child = CloneControl(child as Control); object dst_collection_val = dst_pdc[i].GetValue(dst_ctl); ((IList)dst_collection_val).Add(new_child); } } } else { dst_pdc[src_pdc[i].Name].SetValue(dst_ctl, src_pdc[i].GetValue(src_ctl)); } } return dst_ctl; } } 

gridview显示的数据很好。 这里的问题当我点击linkBut​​ton页面重新加载并且在回发后没有显示网格

第二个问题是,对于LinkButtonClick Event没有触发

当我们点击gridview的linkBut​​ton时,请向我提供帮助全部信息/ Sample以显示模态窗口。

您需要使用ajax模型弹出支出。

使用您的字段设计面板并使用模型弹出计算器来显示该弹出窗口

这个链接有它的样本

http://www.asp.net/ajaxlibrary/ajaxcontroltoolkitsamplesite/modalpopup/modalpopup.aspx

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

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

此代码仅在不是回发时才生成gridview,但是当您单击链接按钮时会发生postpack,这就是当您单击linkbutton时gridview不再显示的原因。

添加以下代码(if代码中包含的其他部分),以便在单击lnkBut​​ton时显示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文件:

  

这是我的插图的代码实现:

  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,因此每次回发时都必须调用此方法,然后你的Page_Load应该是

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

其次,我将向您介绍动态添加LinkBut​​ton到GridView的另一种方法。 我修改了你的GenateGridView只添加标签到DynamicTemplate中 ,还添加了这行gvDynamicArticle.RowDataBound += new GridViewRowEventHandler(gvDynamicArticle_RowDataBound); 处理添加LinkBut​​ton。

 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 = "
Default Grid
"; 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); }

我在GridView的RowDataBound事件处理程序中实现这样,以添加LinkBut​​ton并隐藏我们之前添加的Label:

 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); } } } 

您还可以将任何值设置为LinkBut​​ton的CommandArgument ,然后您可以在警报中显示它。

最后,似乎你想在警报中显示一些值,你可能会像这样编码

 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); }