John Gates, CISSP, CDPSE
asked on
C# code not firing when link or button is clicked
I have tried multiple methods and I cannot figure out why this code will not fire.
Page code:
<asp:Button id="deleteLink" runat="server" text='delete'
oncommand="deleteLink_Comm and" commandargument='<%# Eval("AttachmentId") %>' />
Any help would be appreciated!
-D-
Page code:
<asp:Button id="deleteLink" runat="server" text='delete'
oncommand="deleteLink_Comm
Any help would be appreciated!
-D-
//code behind code
protected void deleteLink_Command(object sender, CommandEventArgs e)
{
int attachId = int.Parse(e.CommandArgument.ToString());
Attachment attach = new Attachment();
attach.InitByPK(attachId);
attach.Delete();
this.Messages.Add(new SuccessMessage("Attachment has been deleted"));
Response.Redirect(Request.Url.ToString());
}
ASKER
Here is the complete aspx snippet:
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>">
<itemtemplate>
<tr>
<td style="padding-right:30px" >
<asp:HyperLink id="attachmentDownloadLink " runat="server"
navigateurl='<%# Eval("VirtualPath").ToStri ng() + Eval("FileName").ToString( ) %>'
target="_blank"
><img runat="server" src="~/images/attach.gif" border="0" align="absmiddle" alt="" /><%# Eval("AttachmentName") %></asp:HyperLink>
</td>
<td style="padding-right:30px" >
<%# Eval("FileName") %>
</td>
<td style="padding-right:30px" align="right">
<%# Eval("DisplaySize") %>
</td>
<td style="padding-right:30px" >
<%# ((Attachment) Container.DataItem).Create dDate.GetV alue("d-MM M-yy") %>
</td>
<td runat="server" visible="<%# CmsUser.CanModifyAttachmen ts(Course. Department Id.ValueIn t) %>">
<asp:HyperLink id="editLink" runat="server" text="edit"
navigateurl='<%# Request.Path + "?unitId=" + UnitId + "&attachId=" + Eval("AttachmentId") %>' />
|
<asp:linkButton id="deleteLink" runat="server" text='delete'
oncommand="deleteLink_Comm and" commandargument='<%# Eval("AttachmentId") %>' CommandName="deleteLink" EnableViewState="False" />
</td>
</tr>
</itemtemplate>
</asp:Repeater>
The item is in a repeater not a datagrid. Is there a method in this case?
-D-
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>">
<itemtemplate>
<tr>
<td style="padding-right:30px"
<asp:HyperLink id="attachmentDownloadLink
navigateurl='<%# Eval("VirtualPath").ToStri
target="_blank"
><img runat="server" src="~/images/attach.gif" border="0" align="absmiddle" alt="" /><%# Eval("AttachmentName") %></asp:HyperLink>
</td>
<td style="padding-right:30px"
<%# Eval("FileName") %>
</td>
<td style="padding-right:30px"
<%# Eval("DisplaySize") %>
</td>
<td style="padding-right:30px"
<%# ((Attachment) Container.DataItem).Create
</td>
<td runat="server" visible="<%# CmsUser.CanModifyAttachmen
<asp:HyperLink id="editLink" runat="server" text="edit"
navigateurl='<%# Request.Path + "?unitId=" + UnitId + "&attachId=" + Eval("AttachmentId") %>' />
|
<asp:linkButton id="deleteLink" runat="server" text='delete'
oncommand="deleteLink_Comm
</td>
</tr>
</itemtemplate>
</asp:Repeater>
The item is in a repeater not a datagrid. Is there a method in this case?
-D-
If you aren't operating within the bounds of a gridview control then you are probably making this harder than it needs to be in the way that you are going about it. If you could post some of your code and describe your situation a little more I could probably help you a bit further.
<asp:Repeater runat="server" ID="attachmentRepeater" OnItemCommand="attachmentR epeater_On ItemComman d">
</asp:Repeater>
protected void attachmentRepeater_OnItemC ommand(obj ect sender, RepeaterCommandEventArgs e)
{
}
Refer to my previous code example in using the gridview, but substitute this markup and method signature.
</asp:Repeater>
protected void attachmentRepeater_OnItemC
{
}
Refer to my previous code example in using the gridview, but substitute this markup and method signature.
ASKER
I have tried the above to no avail... No matter what code is placed when the button is hovered over this is what it is referring to..:
javascript:WebForm_DoPostB ackWithOpt ions(new WebForm_PostBackOptions("_ ctl0:_ctl0 :_ctl0:mai nContent:c enterConte nt:centerC ontent:att achmentRep eater:_ctl 0:deleteLi nk", "", true, "", "", false, true))
P.S. I inherited this fine project after 4 other developers that worked on it and never documented anything have had their way with it. I am just trying to make sense of this. VB.NET is the language I am most familiar with. I have never seen an event not fire like this. I will post the entire page and code behind code. I just want this to work :-)
Thanks
-D-
javascript:WebForm_DoPostB
P.S. I inherited this fine project after 4 other developers that worked on it and never documented anything have had their way with it. I am just trying to make sense of this. VB.NET is the language I am most familiar with. I have never seen an event not fire like this. I will post the entire page and code behind code. I just want this to work :-)
Thanks
-D-
<ASPX page>
<%@ Page Language="C#" MasterPageFile="~/Secure/Courses/CourseConsoleMaster.master" AutoEventWireup="true" CodeFile="CourseUnitAttachment.aspx.cs" Inherits="Secure_Courses_CourseUnitAttachment" %>
<%@ Import namespace="CMS.Data.Entities" %>
<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="leftContent">
<uc:CourseList Runat="server" ID="CourseList"/>
</asp:Content>
<asp:Content ID="Content2" runat="server" ContentPlaceHolderID="centerContent">
<table width="100%">
<tr>
<td class="tabSelected" style="padding: 10px">
<div id="consolecrumb">
<asp:HyperLink runat="server" NavigateUrl='<%# "CourseUnits.aspx?grade=" + GradeCode + "&course=" + CourseId %>'
Text='<%# Unit.UnitName + "> Attachments" %>' />
</div>
<uc:Messages runat="server" />
<table>
<tr runat="server" visible="<%# Attachments.Count == 0 %>">
<td>
There are no existing attachments.
</td>
</tr>
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>">
<itemtemplate>
<tr>
<td style="padding-right:30px">
<asp:HyperLink id="attachmentDownloadLink" runat="server"
navigateurl='<%# Eval("VirtualPath").ToString() + Eval("FileName").ToString() %>'
target="_blank"
><img runat="server" src="~/images/attach.gif" border="0" align="absmiddle" alt="" /><%# Eval("AttachmentName") %></asp:HyperLink>
</td>
<td style="padding-right:30px">
<%# Eval("FileName") %>
</td>
<td style="padding-right:30px" align="right">
<%# Eval("DisplaySize") %>
</td>
<td style="padding-right:30px">
<%# ((Attachment) Container.DataItem).CreatedDate.GetValue("d-MMM-yy") %>
</td>
<td runat="server" visible="<%# CmsUser.CanModifyAttachments(Course.DepartmentId.ValueInt) %>">
<asp:HyperLink id="editLink" runat="server" text="edit"
navigateurl='<%# Request.Path + "?unitId=" + UnitId + "&attachId=" + Eval("AttachmentId") %>' />
|
<asp:linkButton id="deleteLink" runat="server" text='delete'
commandargument='<%# Eval("AttachmentId") %>' CommandName="Delete" EnableViewState="False" />
</td>
</tr>
</itemtemplate>
</asp:Repeater>
</table>
<hr />
<table runat="server" visible="<%# CmsUser.CanModifyAttachments(Course.DepartmentId.ValueInt) %>">
<tr>
<td colspan="2">
<b>Add Attachment</b> <br /> <br />
</td>
</tr>
<tr>
<td>
Attachment Name:
</td>
<td>
<dk:LabelTextBox ID="attachmentNameTextBox" Columns="30" runat="server"
Text="<%# Attach.AttachmentName %>" MaxLength="50" />
<dk:Validator runat="server" Required="true" Label="Attachment Name"
Control="attachmentNameTextBox" />
<dk:FocusSetter runat="server" Control="attachmentNameTextBox" />
</td>
</tr>
<tr runat="server" visible="<%# Attach.IsNew %>">
<td>
File Path:
</td>
<td>
<input type="file" runat="server" id="uploadFile" name="uploadFile" />
<dk:Validator runat="server" Control="uploadFile" Label="File Path"
Required="true" />
</td>
</tr>
<tr>
<td></td>
<td>
<br />
<asp:Button runat="server" text="Submit" onclick="uploadButton_Click" id="Button1" />
<asp:Button runat="server" text="Cancel" onclick="cancelButton_Click" id="Button2" />
</td>
</tr>
</table>
</td>
</tr>
</table>
<br />
</asp:Content>
</Page>
</page code>
<Code behind>
using System;
using System.Collections;
using System.Web.UI.WebControls;
using CMS.Data.Entities;
using CMSWeb.Public;
using DK.Util;
using DK.Web;
public partial class Secure_Courses_CourseUnitAttachment : BasePage
{
private IList _attachments;
private Attachment _attachment;
public override void DataBind()
{
Page.Items["ConsoleTab"] = "units";
base.DataBind();
}
protected IList Attachments
{
get
{
if (_attachments == null)
{
Attachment a = new Attachment();
_attachments = a.FindByUnitOfStudyId(UnitId);
}
return _attachments;
}
}
protected Attachment Attach
{
get
{
if (_attachment == null)
{
_attachment = new Attachment();
if (AttachmentId > 0)
{
_attachment.InitByPK(AttachmentId);
}
}
return _attachment;
}
}
// protected void attachClick_Command(object sender, EventArgs e)
// {
// Response.Redirect("~/Secure/Courses/CourseUnitAttachment.aspx" + "?unitId=" + UnitId);// + "?attachmentId=" + AttachmentId);
// }
protected void attachmentRepeater_OnItemCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
int attachId = int.Parse(e.CommandArgument.ToString());
Attachment attach = new Attachment();
attach.InitByPK(attachId);
attach.Delete();
this.Messages.Add(new SuccessMessage("Attachment has been deleted"));
Response.Redirect(Request.Url.ToString());
}
}
protected void deleteLink_Command(object sender, CommandEventArgs e)
{
int attachId = int.Parse(e.CommandArgument.ToString());
Attachment attach = new Attachment();
attach.InitByPK(attachId);
attach.Delete();
this.Messages.Add(new SuccessMessage("Attachment has been deleted"));
Response.Redirect(Request.Url.ToString());
}
protected void UploadFile()
{
Attach.AttachmentName.Value = attachmentNameTextBox.Text.Trim();
if (Attach.IsNew)
{
Attach.PostedFile = uploadFile.PostedFile;
Attach.UnitOfStudyId.ValueInt = UnitId;
// set schoolId and courseId to determine file location for new attachments
Attach.SchoolId.ValueInt = CmsSession.SchoolId;
Attach.CourseId.ValueInt = CourseId;
}
Attach.Save(CmsSession.UserId);
}
protected void uploadButton_Click(object sender, EventArgs e)
{
if (IsValid)
{
UploadFile();
Messages.Add(new SuccessMessage("Attachment saved successfully"));
Response.Redirect(Request.Url.ToString());
}
}
protected void cancelButton_Click(object sender, EventArgs e)
{
Response.Redirect(Url("~/Secure/Courses/CourseUnits.aspx?dept&grade&course"));
}
protected int AttachmentId
{
get
{
if (StringUtil.HasChars(Request["attachId"]))
{
return int.Parse(Request["attachId"]);
}
else
{
return 0;
}
}
}
}
</Code behind>
It looks like you forgot to add the
OnItemCommand="attachmentR epeater_On ItemComman d"
to the markup of the repeater like I showed in my example...
So you placed the method in the code behind, but you never actually wired it up to an event.
OnItemCommand="attachmentR
to the markup of the repeater like I showed in my example...
So you placed the method in the code behind, but you never actually wired it up to an event.
So...
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>" OnItemCommand="attachmentR epeater_On ItemComman d">
<itemtemplate>
<tr>
.....
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>" OnItemCommand="attachmentR
<itemtemplate>
<tr>
.....
ASKER
the same result occurs. When hovering over the button the following is displayed:
javascript:WebForm_DoPostB ackWithOpt ions(new WebForm_PostBackOptions("_ ctl0:_ctl0 :_ctl0:mai nContent:c enterConte nt:centerC ontent:att achmentRep eater:_ctl 0:deleteLi nk", "", true, "", "", false, true))
I just don't get it.
javascript:WebForm_DoPostB
I just don't get it.
ASKER
You click and nothing happens. I am attaching the code again so that you see the changes.. I have a breakpoint set in the code and it never catches. The attachmentRepeater_OnItemC ommand event never gets called. I have never seen anything like it.
-D-
-D-
<asp:Repeater runat="server" id="attachmentRepeater" datasource="<%# Attachments %>" OnItemCommand="attachmentRepeater_OnItemCommand">
<itemtemplate>
<tr>
<td style="padding-right:30px">
<asp:HyperLink id="attachmentDownloadLink" runat="server"
navigateurl='<%# Eval("VirtualPath").ToString() + Eval("FileName").ToString() %>'
target="_blank"
><img runat="server" src="~/images/attach.gif" border="0" align="absmiddle" alt="" /><%# Eval("AttachmentName") %></asp:HyperLink>
</td>
<td style="padding-right:30px">
<%# Eval("FileName") %>
</td>
<td style="padding-right:30px" align="right">
<%# Eval("DisplaySize") %>
</td>
<td style="padding-right:30px">
<%# ((Attachment) Container.DataItem).CreatedDate.GetValue("d-MMM-yy") %>
</td>
<td runat="server" visible="<%# CmsUser.CanModifyAttachments(Course.DepartmentId.ValueInt) %>">
<asp:HyperLink id="editLink" runat="server" text="edit"
navigateurl='<%# Request.Path + "?unitId=" + UnitId + "&attachId=" + Eval("AttachmentId") %>' />
|
<asp:linkButton id="deleteLink" runat="server" text='delete'
commandargument='<%# Eval("AttachmentId") %>' CommandName="Delete" EnableViewState="False" />
</td>
</tr>
</itemtemplate>
</asp:Repeater>
<----------code behind start -------------------->
protected void attachmentRepeater_OnItemCommand(object sender, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
int attachId = int.Parse(e.CommandArgument.ToString());
Attachment attach = new Attachment();
attach.InitByPK(attachId);
attach.Delete();
this.Messages.Add(new SuccessMessage("Attachment has been deleted"));
Response.Redirect(Request.Url.ToString());
}
}
ASKER
Ideas?
If you comment out the attachmentRepeater_OnItemC ommand method in the code behind and run the application, when you go to the page does it throw and error?
Whenever you refer to a method as an event in the markup of the aspx page, if that method does not exist in the code behind it should throw an error.
Is this even happening?
Whenever you refer to a method as an event in the markup of the aspx page, if that method does not exist in the code behind it should throw an error.
Is this even happening?
ASKER
It does throw an error even before it runs. So that part is happening... Just for some reason it is not calling it when the linkbutton is clicked.
Geese... I'm not sure.
It may be time for you to change strategies. All you need is for link button to delete the data row in the repeater?
You may try using a plain old HTML anchor tag that calls a JavaScript function which will do an asynchronous request out to your sever to delete the database record.
Is this a feasible solution? Let me know if you need help implementing.
It may be time for you to change strategies. All you need is for link button to delete the data row in the repeater?
You may try using a plain old HTML anchor tag that calls a JavaScript function which will do an asynchronous request out to your sever to delete the database record.
Is this a feasible solution? Let me know if you need help implementing.
ASKER
Not really. I am not in love with C# at all at this point.... There are other methods that get produced with that repeater that call a link or URL and they parse fine... I really want to find out why this linkbutton is not functioning as expected.
-D-
-D-
I'm afraid I'm out of ideas for you.
ASKER
Thanks for trying.
-D-
-D-
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I found the solution on my own.
If this is the case than you don't need to wire up the oncommand event like you are. Your link button can just look something like this...
<asp:LinkButton runat="server" ID="lbDelete" Text="Delete" CommandName="Delete" CommandArgument='<%# Eval("AttachmentId")%>' />
Then in your code behind you would do this...
protected void gvYourGridView_OnRowComman
{
if (e.CommandName == "Delete")
{
//Code you want to execute on Delete
//You can access the id of the AttachmentId like this...
Int32 AttachmentId = Convert.ToInt32(e.CommandA
}
}