aleborgMedlem sedan jan. 20013 341 inlägg Försöker att skapa en kolumn i en datagrid, kolumnen ska innehålla en bildknapp. När man klickar på bilden så ska vissa händelser ske, hade tänkt någon sorts "imagebutton_click()", men jag får det inte riktigt att fungera:
<asp:TemplateColumn>
<ItemTemplate>
<asp:ImageButton id="edit" runat="server" ImageUrl="images/edit.gif" CommandName="edit" CommandArgument="<%# DataBinder.Eval(Container.DataItem, "admin_templateID")%>"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
och i codebehind:
private void edit_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
Label1.Text= edit.CommandArgument;
}
Någon som vet hur man löser det, för det här funkar inte alls :(
Det funkar om inte ImageButton ligger i datagriden!
renholmMedlem sedan apr. 20012 266 inlägg När knappen ligger i en datagrid är det lättast att använda "eventet" ItemCommand för DataGriden. För att kunna urskilja vad för kommando som har utförts sätter du ett lämpligt CommandName på din ImageButton som du sedan kontrollerar i din funktion som tar hand om ItemCommand eventet. Hoppas du förstod :)
private void DataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Response.Write(e.CommandName);
}
aleborgMedlem sedan jan. 20013 341 inlägg <asp:datagrid id="TemplatesDG" runat="server" CssClass="table_600_Grey" ShowHeader="False" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:ImageButton id="edit" runat="server" ImageUrl="images/edit.gif" CommandName="<%# DataBinder.Eval(Container.DataItem, "admin_templateID")%>"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
samt codebehind:
private void TemplatesDG_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Label1.Text= e.CommandName;
}
ger mig felet(när jag försöker växla från html till design)
Could not open in Design view. Quote values differently inside a '<%...value..%>' block.
Om jag tar bort det och sätter ett fast värde så uppdateras inte Label1 när jag klickar!
renholmMedlem sedan apr. 20012 266 inlägg I stället för att sätta ID i CommandName kan man sätta det dom DataKey på DataGriden och sedan få ut ID med DataGrid.DataKeys[e.ItemIndex]
renholmMedlem sedan apr. 20012 266 inlägg <asp:datagrid id="TemplatesDG" runat="server" CssClass="table_600_Grey" ShowHeader="False" AutoGenerateColumns="False" [b]DataKeyField="admin_templateID"[/b]>
private void TemplatesDG_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Label1.Text= e.CommandName + ", ID=" + DataGrid.DataKeys[e.ItemIndex];
}
aleborgMedlem sedan jan. 20013 341 inlägg (78): 'System.Web.UI.WebControls.DataGridCommandEventArgs' does not contain a definition for 'ItemIndex'
renholmMedlem sedan apr. 20012 266 inlägg e.Item.ItemIndex kanske det var :)
aleborgMedlem sedan jan. 20013 341 inlägg TemplatesDG.DataKeys[TemplatesDG.SelectedIndex];
ska det tydligen vara, men inget händer med Label1 :(
renholmMedlem sedan apr. 20012 266 inlägg Om du kör med TemplatesDG.SelectedIndex kommer endast det värde som finns på den rad som är markerad som SelectedItem att visas, så e.Item.ItemIndex borde funka för alla rader oavsett vilken som är markerad som SelectedItem :)
Man angående att inget händer så beror det troligen på att du inte har bundit ItemCommand eventet.
För att verkligen kontrollera att något händer i ItemCommand kan du lägga in en Response.Write("Bo!")
aleborgMedlem sedan jan. 20013 341 inlägg Inget händer :(
Hur binder jag det då?
aleborgMedlem sedan jan. 20013 341 inlägg någon som vet vad som är fel?
aleborgMedlem sedan jan. 20013 341 inlägg Det här skulle gå lika bra om man kunde använda en HyperLinkColumn med bild i! Går det att få in en bild i en HyperLinkColumn kolumn?
renholmMedlem sedan apr. 20012 266 inlägg Använder du CodeBehind med VS.NET bör du ha en metod som heter InitializeComponent och i den, om du har bundit ItemCommand rätt, borde det finnas
this.dinDataGrid.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dinDataGrid_ItemCommand);
aleborgMedlem sedan jan. 20013 341 inlägg private void Page_Load(object sender, System.EventArgs e)
{
//check if user is logged in!
if(Session["id"]==null)
Response.Redirect("../default.aspx");
string connectionString = @"Driver={MySQL ODBC 3.51 Driver};server=192.168.2.9;database=webcresiter;uid=usr;pwd=pass";
OdbcConnection conn= new OdbcConnection(connectionString);
conn.Open();
string query= "SELECT admin_templateID,name FROM admin_templates";
OdbcDataAdapter da = new OdbcDataAdapter(query, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Templates");
TemplatesDG.DataSource = ds.Tables["Templates"].DefaultView;
TemplatesDG.DataBind();
conn.Close();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.newtemplate.ServerClick += new System.EventHandler(this.Submit1_ServerClick);
this.TemplatesDG.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.TemplatesDG_ItemCommand);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void TemplatesDG_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
Label1.Text= e.CommandName + ", ID=" + TemplatesDG.DataKeys[e.Item.ItemIndex];
Response.Write("Booo");
}
<asp:datagrid id="TemplatesDG" runat="server" DataKeyField="admin_templateID" AutoGenerateColumns="False" ShowHeader="False" CssClass="table_600_Grey">
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="admin_templateID" DataNavigateUrlFormatString="reseller_template_newdit.htm?id={0}" DataTextField="name"></asp:HyperLinkColumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:ImageButton id="edit" runat="server" ImageUrl="images/edit.gif" CommandName="edit"></asp:ImageButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
Så ser koden ut, men inget händer, HyperLinkColumnen funkar...
renholmMedlem sedan apr. 20012 266 inlägg Mystiskt, ser inte riktigt vad som skulle kunna vara fel, angående att HyperLinkColumn fungerar så beror det väl på att det är en "riktig" länk som inte kontrolleras av ASP.NET efter man klickat på den,
Denna kod fungerar för mig
private Business.Node node;
protected System.Web.UI.WebControls.DataGrid dgNodes;
private void Page_Load(object sender, System.EventArgs e)
{
node = new Business.Node(int.Parse(Request.QueryString["nid"]), true);
if (!Renholm.Omega.Security.Business.Account.HasAccess(node.Admins))
throw new System.Security.SecurityException("Access Denied");
if (!Page.IsPostBack)
{
BindData();
}
}
private void BindData()
{
dgNodes.DataSource = node.Children;
dgNodes.DataBind();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dgNodes.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.dgNodes_ItemCommand);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void dgNodes_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
switch(e.CommandName)
{
case "Up":
node.Children[e.Item.ItemIndex].Order += -3;
node.Children.Sort();
node.Children.Save();
break;
case "Down":
node.Children[e.Item.ItemIndex].Order += 3;
node.Children.Sort();
node.Children.Save();
break;
case "Delete":
node.Children[e.Item.ItemIndex].Delete();
Response.Redirect(Request.RawUrl);
break;
}
Response.Redirect(Request.RawUrl);
}
<asp:datagrid id="dgNodes" autogeneratecolumns="False" width="100%" runat="server" borderwidth="0px" cellpadding="4" cssclass="font_standard_0">
<edititemstyle backcolor="#FFFFDD"></edititemstyle>
<alternatingitemstyle backcolor="#F6F6F6"></alternatingitemstyle>
<itemstyle verticalalign="Top"></itemstyle>
<headerstyle cssclass="font_standard_0_bold"></headerstyle>
<columns>
<asp:boundcolumn datafield="Name" headertext="Name"></asp:boundcolumn>
<asp:templatecolumn itemstyle-horizontalalign="Right" itemstyle-width="30px">
<itemtemplate>
<asp:imagebutton runat="server" id="btnUp" imageurl="~/Images/arrow_up.png" commandname="Up">
</asp:imagebutton>
<asp:imagebutton runat="server" id="btnDown" imageurl="~/Images/arrow_down.png" commandname="Down">
</asp:imagebutton>
</itemtemplate>
</asp:templatecolumn>
<asp:templatecolumn itemstyle-horizontalalign="Right" itemstyle-width="10px">
<itemtemplate>
<asp:imagebutton runat="server" id="btnDelete" imageurl="~/Images/delete.png" commandname="Delete">
</asp:imagebutton>
</itemtemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
Kom på en till sak, din databind sker även vid postback vilket är oftast onödigt då ViewState är aktiverat. Lägg din kod som hämtar och binder datan i en if (!Page.IsPostBack).