I en usercontrol har jag en gridview med en kolumn med Update knappar. Detta är saxat ur en mycket bra artikelserie "TRULY Understanding Dynamic Controls"Hur får jag click eventet för en knapp i en gridview av fungera i en usercontrol
Usercontrol:en läggs till dynamiskt eftersom antalet usercontrol:er bestäms i runtime.
Jag använder mig av UpdatePanel runt gridviewen då jag endast vill ladda om den istället för hela sidan.
Därför får jag lägga till UpdatePanel dynamiskt samtidigt som usercontrol:en
protected void btnAddGV_Click(object sender, EventArgs e)
{
//Lägg till gridviewen dynamiskt
Control wuc = LoadControl("WebUserControl.ascx");
//Skapa UpdatePanel
UpdatePanel up1 = new UpdatePanel();
up1.ID = "UpdatePanel1";
//Lägg till user kontrollen till UpdatePanel
up1.ContentTemplateContainer.Controls.Add(wuc);
//Lägg till UpdatePanel till Placeholdern
PlaceHolder1.Controls.Add(up1);
}
Just nu har jag en knapp som heter btnAddGV som kör ovanstående kod när man klickar på den.
GridViewen laddas upp på sidan...
När jag klickar på en knapp på en rad i gridviewen vill jag att eventet aktiveras/körs för btnUpdate_Click (se koden nedan) men det händer inte i detta läge.
Vad kan detta bero på?
/Jesper
Koden ser ut som följer:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div><asp:Label ID="Label1" runat="server" Text="Lägg till en tabell..."></asp:Label>
<asp:Button ID="btnGRV" runat="server" Text="Button" OnClick="btnAddGV_Click" />
<asp:PlaceHolder ID="PlaceHolder1" runat="server">
</asp:PlaceHolder>
</div>
<br />
</form>
</body>
</html>
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnAddGV_Click(object sender, EventArgs e)
{
//Lägg till gridviewen dynamiskt
Control wuc = LoadControl("WebUserControl.ascx");
//Skapa UpdatePanel
UpdatePanel up1 = new UpdatePanel();
up1.ID = "UpdatePanel1";
//Lägg till user kontrollen till UpdatePanel
up1.ContentTemplateContainer.Controls.Add(wuc);
//Lägg till UpdatePanel till Placeholdern
PlaceHolder1.Controls.Add(up1);
}
}
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="ProductID">
<Columns>
<asp:TemplateField ItemStyle-Width="20">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClick="btnUpdate_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<Columns>
<asp:ButtonField CommandName="Update" Text="Update" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice], [UnitsInStock] FROM [Products] WHERE ([ProductID] = @ProductID)">
<SelectParameters>
<asp:QueryStringParameter Name="ProductID" QueryStringField="ProductID" Type="Int32" DefaultValue="1" />
</SelectParameters>
</asp:SqlDataSource>
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class WebUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
GridView1.RowCommand += new GridViewCommandEventHandler(GridView1_RowCommand);
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Update")
{
string a = "a";
}
//throw new Exception("The method or operation is not implemented.");
}
protected void btnUpdate_Click(object sender, EventArgs e)
{
Button btnUpdate = (Button)sender;
GridViewRow gvr = (GridViewRow)btnUpdate.NamingContainer;
GridView gv = (GridView)gvr.NamingContainer;
//Ta fram värdet för den här raden
int intTestcaseID = (int)gv.DataKeys[gvr.RowIndex].Value;
//...
}
}Sv: Hur får jag click eventet för en knapp i en gridview av fungera i en usercon
http://weblogs.asp.net/infinitiesloop/archive/2006/10/16/TRULY-Understanding-Dynamic-Controls-_2800_Part-3_2900_.aspx
"A common mistake made by developers is to add a dynamic control to the tree only in response to some event. For example, lets say you have a button on the form that reads, "Click here to enter your name", and when clicked you want to dynamically add a TextBox for them to enter it into:
private void cmdEnterName_Click(object sender, EventArgs e)
{
TextBox txtFirstName = new TextBox();
this.Controls.Add(txtFirstName);
}
If you try it, you'll see the TextBox like you expect. But on the next postback, unless the user clicks this very same button a second time, the TextBox will cease to exist!"
Så när jag laddar usercontroll:en i LoadPage istället för via en knapp så fungerar eventen!
/Jesper