Afternoon All,
I am using a visual studio 2010. I have a web page which is used to record minutes of meetings. The page has a section that the user can use to add 'Actions' to the site. I can get a user to successfully add an action to the page.
The issue that i have is i also have a grid view on the webpage and would like this to refresh once the user has added the new 'Action' to the page. So that the user can see that its been submitted.
Im new ish to the .net environment and VB and im not sure 100% how to complete this task.
I have the following code from my .aspx page....
Submitted Actions:
<hr />
<!-- DataSource for submitted Actions -->
<asp:SqlDataSource ID="OutstandingActionsDS" runat="server"
ConnectionString="<%$ ConnectionStrings:SMCConnectionString %>"
SelectCommand="Populate_grdOutstandingActions"
SelectCommandType="StoredProcedure"></asp:SqlDataSource>
<!-- Gridview that holds submitted Actions -->
<asp:GridView ID="GridView1" runat="server" DataSourceID="OutstandingActionsDS">
</asp:GridView>
<br />
<br />
New Actions to Record:
<hr />
<!-- Add new Action -->
<asp:Panel ID="pnlHeaderAction" runat="server" CssClass="pnl" Width="740px">
<div style="float:left;">
Record New Actions
</div>
<div style="float:right;">
<asp:Label ID="lblShowHideAction" runat="server" ></asp:Label>
</div>
<div style="clear:both"></div>
</asp:Panel>
<asp:Panel ID="pnlInfoAction" runat="server" CssClass="pnlBody">
<table>
<tr>
<td style="width:498px; height: 15px;"><h5>Actions:</h5></td>
<td style="width:130px; height: 15px;"><h5>Owner:</h5></td>
<td style="height: 15px;"><h5> Target Date:</h5></td>
</tr>
</table>
<table style="width: 99%">
<tr>
<td style="width: 495px">
<asp:TextBox ID="txtAction" runat="server" TextMode="MultiLine"
Width="493px" Height="50px" style="font-family:Verdana"></asp:TextBox>
</td>
<td style="width: 132px" valign="top">
<asp:TextBox ID="txtOwner" runat="server" Height="50px"
width="128px" style="font-family:Verdana"></asp:TextBox>
</td>
<td valign="top">
<asp:TextBox ID="txtTargetDate" runat="server" width="89px" style="font-family:Verdana"></asp:TextBox>
</td>
</tr>
</table>
<br />
<div style="text-align: right;">
<asp:Button ID="btnAddAction" runat="server" Text="Add New Action" CssClass="button" />
</div>
</asp:Panel>
Here is my code for the VB page...
Protected Sub btnAddAction_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddAction.Click
Dim oActionClass As New ActionClass
With oActionClass
.Action = txtAction.Text
.Owner = txtOwner.Text
.TargetDate = New SmartDate(Convert.ToDateTime(txtTargetDate.Text))
oActionClass.ActionID = ActionClassDAL.AddActionClass(oActionClass)
ClearActions()
End With
End Sub
Private Sub ClearActions()
txtAction.Text = ""
txtOwner.Text = ""
txtTargetDate.Text = ""
End Sub
This seems like a simple request but i cant seem to find anything that shows me how to refresh the grid based on the user adding the action to the system.
Many thanks in advance for any help offered.
Regards
Betty
you just have to put a databind to the GridView1. I think is something like this:
me.GridView1.databind();
On the bottom of your method btnAddAction_Click.
I hope I have been helpful.
Related
I have a textbox and a GridView. I have made a column in gridview as a linkbutton. I want that when I click a linkbutton I get that link button text value in my textbox.
My gridview is shown below-
I want When I click test5 my textbox1.text = test5 and so on..
How can I do this ?
Please add commandname in gridview link column as below
<asp:LinkButton runat="server" id="lnklink" CommandName="displayLink" />
And add the "RowCommand" event on gridview like below
<asp:GridView ID="gvDemo" runat="server
onrowcommand="gvDemo_RowCommand" />
protected void gvDemo_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "displayLink")
{
textbox1.text=((LinkButton)e.CommandSource).Text;
}
}
You can do this both in asp as well as using client side technologies like JQUERY javascript etc, I will suggest you to use jquery since keeping such things in client side will help you improve the performance
Now when u create a grid /repeater etc ultimately .net renders it into simple html controls, and jquery or client side technologies just work over this html , here is a small example with simple html
> HTML
My data : <input type="Text" id="TxtBox"/> //in .net id u have to take care by using .clientid property
<table>
<tr>
<td width="50">
<input type="checkbox"/>
</td>
<td width="50">
SOmething
</td>
<td width="50">
<a href="#" class="someName" >LINK1</a>
</td>
</tr>
<tr>
<td width="50">
<input type="checkbox"/>
</td>
<td width="50">
SOmething2
</td>
<td width="50">
<a href="#" class="someName" >LINK2</a> //class name is important since thats what we are going deal with
</td>
</tr>
<tr>
<td width="50">
<input type="checkbox"/>
</td>
<td width="50">
SOmething3
</td>
<td width="50">
LINK3
</td>
</tr>
</table>
JQUERY
$(".someName").on("click","",function(){
$("#TxtBox").val($(this).text());
});
FIDDLE
http://jsfiddle.net/AmarnathRShenoy/Hw4UG/
create RowCommand event for grid and then do the following code
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.ToLower() == "test")
{
textbox1.Text = e.CommandArgument.ToString();
}
}
and for aspx page do the following in your linkbutton
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="linkbtn" runat="server" Text="test5" CommandArgument="test5" CommandName="test" />
</ItemTemplate>
</asp:TemplateField>
or if you are binding your database table column to your linkbutton then do the following
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="linkbtn" runat="server" Text='<% yourcolumname %>' CommandArgument='<% yourcolumname %>' CommandName="test" />
</ItemTemplate>
</asp:TemplateField>
Here's the top end of my list view
<asp:ListView ID="ui_lvJobList" runat="server" OnPagePropertiesChanging="ui_lvJobList_PagePropertiesChanging"
OnItemDataBound="ui_lvJobList_ItemDataBound" OnItemCommand="ui_lvJobList_ItemCommand"
OnDataBound="ui_lvJobList_DataBound" OnPagePropertiesChanged="ui_lvJobList_PagePropertiesChanged">
<LayoutTemplate>
<div>
<table class="jobs-table jobs-table-body">
<tbody>
<tr runat="server" id="itemPlaceholder" />
</tbody>
</table>
</div>
</LayoutTemplate>
<ItemTemplate>
<tr id="ui_jobId<%# DataBinder.Eval(Container.DataItem,"JobID") %>" class="<%# DataBinder.Eval(Container.DataItem, "StatusID").ToString() == "1" ? "jobs-row" : "jobs-row-started"%>"
onmouseover="this.style.backgroundColor='#b8e4f7';" onmouseout="this.style.backgroundColor='#efefef';">
<td class="jobs-table-JobId">
<span class="no-decoration cursor-pointer">
<%# DataBinder.Eval(Container.DataItem,"JobID") %>
</span>
</td>
<td class="hidden-ui-control click-me-to-edit">
<asp:LinkButton runat="server" CommandName="EditJob" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"JobID") %>'
ID="ui_btnListViewEditJob" CssClass="no-decoration cursor-pointer">
<%# DataBinder.Eval(Container.DataItem,"JobID") %>
</asp:LinkButton>
</td>
...and here's my jQuery to handle double-click on any cell
$("tr[class^='jobs-row'] td").dblclick(function (e) {
e.preventDefault();
$(this).parent().find("td.click-me-to-edit a").click();
});
... I'm using jquery-1.8.3
The problem: the OnItemCommand is not firing when I double-click the row; there are more cells than I've included but I left them out for brevity.
I've tried with & without the preventDefault.
The dblclick function is being hit, I've run it with the chrome dev tools.
Thanks in advance for having a look. Let me know if I've not included enough of anything.
N
Cracked It!
I changed the LinkButton for a Button (& made the appropriate change to the jQuery selector) & it works OK, now.
I am completely new to Ajax and have had no training. I'm just copying a co-worker's code. We have a page with two Ajax controls: one my co-worker wrote and one I wrote. Everything is working fine except for one item, and my co-worker's up to his eyeballs in another project, so I need to figure this out. The problem is that the Ajax control I wrote pops up a ListBox with two buttons: Close and Select. The Select button has an OnClick event and causes a postback, as is expected. However, the Close button does not have an OnClick event and still causes a postback. This is not the case with a very similar Ajax control that my co-worker wrote that sits on the same page. The code is below. My co-worker's code involves the Email Template; mine involves the Email(s) Lookup. For the life of me, I don't see any difference. Can anyone tell me why my Close button causes a PostBack and my co-worker's doesn't?
<!--my co-worker's control-->
<tr>
<td width="20%"><br /><div class="formtext">Email Template:</div></td>
<td colspan="3"><br />
<asp:Button ID="btn_ShowTemplate" runat="server"
Text="View/Edit Template" />
<ajax:ModalPopupExtender ID="mpTemplate" runat="server" PopupControlID="panelTemplate" TargetControlID="btn_ShowTemplate"
CancelControlID="BtnTemplateClose" BackgroundCssClass="modalBackground">
</ajax:ModalPopupExtender>
<asp:Panel ID="panelTemplate" runat="server" CssClass="modalPopupTemplate" align="center">
<div class="formtext_modal">Litigation Hold Email Template <img src="images/v2/modal_email.png" alt="Email" /><br /></div>
<cc1:Editor ID="TemplateEditor" runat="server" Width="675px" Height="400px" />
<br />
<asp:Button ID="BtnTemplateClose" runat="server" Text="Close" CssClass="btnMatterClose" />
<asp:Button ID="btnTemplateSave" runat="server" Text="Save" CssClass="btnMatterSelect" OnClick="btnTemplateSave_Click" />
</asp:Panel></td>
</tr>
<!--my control-->
<tr>
<!-- email cc section -->
<td>Email CC:<br /></td>
<td colspan="3"><asp:Button ID="btnEmails" runat="server" Text="Lookup Email" /> <asp:TextBox
ID="tbEmails" runat="server" Width="80%" ReadOnly="true"></asp:TextBox><br />
<ajax:ModalPopupExtender ID="mpEmails" runat="server" PopupControlID="panelEmails" TargetControlID="btnEmails"
CancelControlID="btnClose" BackgroundCssClass="modalBackground">
</ajax:ModalPopupExtender>
<asp:Panel ID="panelEmails" runat="server" CssClass="modalPopupAttorneys" align="center">
<table align="center" width="100%">
<tr>
<td>
<div class="formtext_modal">Email(s) Lookup <img src="images/v2/modal_search.png" alt="Search" /></div><br />
<asp:Label ID="Label3" runat="server" Width="600px" CssClass="formtext"
Text="Add Employees to Email CC line"></asp:Label>
<div style="BORDER: thin solid; OVERFLOW: auto; WIDTH: 600px; HEIGHT: 140px">
<asp:CheckBoxList ID="cblEmails" runat="server" Width="600px" Height="140px" SelectionMode="Multiple">
</asp:CheckBoxList>
</div>
</td>
</tr>
Server side buttons always cause a post back. One way to get around it is to add a client click function that returns false.
OnClientClick="return false;"
Edit
Your co-worker has defined the CancelControlID="BtnTemplateClose" on the ModalPopupExtender. That is what is repressing the post back. You also have the CancelControlID defined, but I can't find the close button (btnClose) anywhere in the code you have posted. Where are the close buttons in your control? If you make sure your close button has the ID btnClose, it would most likely work like your co-worker's close button.
I have a page that I am working on that I'm linking multiple user controls to. The user control contains 3 buttons, an attach, clear and view button. When a user clicks on any control on the page, the resulting information is "dumped" into the last visible control on the page.
<%# Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" MasterPageFile="DefaultPage.master" %>
<%# Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<%# Register tagName="FileHandler" src="FileHandling.ascx" tagPrefix="ucFile" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
<asp:UpdatePanel ID="upPanel" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<table>
<tr>
<td>
<ucFile:FileHandler ID="fFile1" runat="server" />
</td>
<td>
<ucFile:FileHandler ID="fFile2" runat="server" />
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
All file handling and processing is handled within the control, with an event when the upload to the file server is complete via a file name that was generated. When either button is clicked, the file name is always stored internal to the control in the last control's text box.
Control code:
<table style="width: 50%;">
<tr style="white-space: nowrap;">
<td style="width: 1%;">
<asp:Label runat="server" ID="lblFile" />
</td>
<td style="width: 20%;">
<asp:TextBox ID="txtFile" CssClass="backColor" runat="server" OnTextChanged="FileInformationChanged" />
</td>
<td style="width: 1%">
<%--<asp:Button runat="server" ID="btnUpload" CssClass="btn" Text="Attach" OnClick="UploadFile"/>--%>
<input type="button" id="btnUpload" class="btn" tabindex="30" value="Attach" onclick="SetupUpload();" />
</td>
<td style="width: 1%">
<%--<asp:Button runat="server" ID="btnClear" Text="Clear" CssClass="btn" OnClick="ClearTextValue"/>--%>
<input type="button" id="btnClearFile" class="btn" value="Clear" onclick="document.getElementById('<%=txtFile.ClientID%>').value = '';document.getElementById('<%=hfFile.ClientID%>').value = '';" />
</td>
<td style="width: 1%">
View
</td>
<td style="width: 1%">
<asp:HiddenField ID="hfFile" runat="server" />
</td>
</tr>
</table>
<script type="text/javascript">
var ItemPath = "";
function SetupUpload(File) {
ItemPath = File;
VersionAttach('<%=UploadPath%>', 'true');
}
function UploadComplete(File) {
document.getElementById('<%=txtFile.ClientID%>').value = File.substring(File.lastIndexOf("/") + 1);
document.getElementById('<%=hfFile.ClientID%>').value = File;
alert('<%=txtFile.Text %>');
alert('<%=ClientID %>')
}
function ViewLink(File, Alert) {
if (File != "") {
if (File.indexOf("../data/") != -1) {
window.open(File, '_blank');
}
else {
window.open('../data/<%=UploadPath%>/' + File, '_blank');
}
}
else if (Alert == "") {
alert('No file has been uploaded for this field.');
}
}
</script>
There are a couple of ways
a) use control.FindControl("hfFile")
b)
private HiddenField hfFile;
protected void hfFile_OnInit(object sender, EventArgs e){
hfFile = (HiddenField)sender;
}
The way I got this to work in my case was to put a title on the input button (client control), then passing the value of the clientid of the control that I wanted (textbox in this case) to the function in the onclick event (client event). I then "force" the consumer of the control to use this information when the button is clicked. The reason for the question here was to find out if there is a better way of accomplishing this within the control instead of making the consumer of the control handle the data. This does work for my purpose, it just doesn't seem as clean as I would have liked.
I define some controls inside repeater itemtemplate, the problem is with the Id that are generated automatically.
This is my page:
<asp:Repeater ID="rptThreads" runat="server"
onitemcreated="rptThreads_ItemCreated">
<HeaderTemplate>
<table cellpadding="0px" cellspacing="0">
</HeaderTemplate>
<ItemTemplate>
<tr style="height:50px">
<td>
<asp:PlaceHolder ID="plcItemTitle" runat="server">
<asp:Panel id="titleContainer" runat="server" style="position:absolute;">
<asp:HyperLink ID="lnkTitle" runat="server" style="float:left;padding-right:10px;" Text='<%# Container.DataItem%>'/>
<asp:Panel id="pnlEditButtons" runat="server" Visible="false" style="vertical-align:middle;z-index:100;display:none;float:left;" >
<asp:ImageButton ID="imgbtn1" runat="server" ImageUrl="~/Images/misc/edit.png" />
<asp:ImageButton ID="imgbtn2" runat="server" ImageUrl="~/Images/misc/Rename.png" />
</asp:Panel>
</asp:Panel>
</asp:PlaceHolder>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
Now I will try to describe the problem:
code-behind:
protected void Page_Load(object sender, EventArgs e)
{
int [] array = {1,2,3,4,5};
rptThreads.DataSource = array;
rptThreads.DataBind();
}
protected void rptThreads_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
Panel editButtonsPanel = e.Item.FindControl("pnlEditButtons") as Panel;
editButtonsPanel.Visible = true;
Panel containerPanel = e.Item.FindControl("titleContainer") as Panel;
//Point of Interest!!!!
containerPanel.Attributes.Add("onmouseover", "ShowEditButtons('" + editButtonsPanel.ClientID + "');");
}
}
If I run the page as is, the generated html will be the following (I show only the first 2 items):
<table cellpadding="0px" cellspacing="0">
<tr style="height:50px">
<td>
<div id="titleContainer" onmouseover="ShowEditButtons('pnlEditButtons');" style="position:absolute;">
<a id="lnkTitle" style="float:left;padding-right:10px;">1</a>
<div id="pnlEditButtons" style="vertical-align:middle;z-index:100;display:none;float:left;">
<input type="image" name="imgbtn1" id="imgbtn1" src="Images/misc/edit.png" style="border-width:0px;" />
<input type="image" name="imgbtn2" id="imgbtn2" src="Images/misc/Rename.png" style="border-width:0px;" />
</div>
</div>
</td>
</tr>
<tr style="height:50px">
<td>
<div id="titleContainer" onmouseover="ShowEditButtons('pnlEditButtons');" style="position:absolute;">
<a id="lnkTitle" style="float:left;padding-right:10px;">2</a>
<div id="pnlEditButtons" style="vertical-align:middle;z-index:100;display:none;float:left;">
<input type="image" name="imgbtn1" id="imgbtn1" src="Images/misc/edit.png" style="border-width:0px;" />
<input type="image" name="imgbtn2" id="imgbtn2" src="Images/misc/Rename.png" style="border-width:0px;" />
</div>
</div>
</td>
</tr>
As you can see all divs get the SAME ID, THIS I DONT WANT!!!
But If I omit this line form the ItemCreated event:
containerPanel.Attributes.Add("onmouseover", "ShowEditButtons('" + editButtonsPanel.ClientID + "');");
The generated HTML will be the following:
<table cellpadding="0px" cellspacing="0">
<tr style="height:50px">
<td>
<div id="rptThreads_ctl01_titleContainer" style="position:absolute;">
<a id="rptThreads_ctl01_lnkTitle" style="float:left;padding-right:10px;">1</a>
<div id="rptThreads_ctl01_pnlEditButtons" style="vertical-align:middle;z-index:100;display:none;float:left;">
<input type="image" name="rptThreads$ctl01$imgbtn1" id="rptThreads_ctl01_imgbtn1" src="Images/misc/edit.png" style="border-width:0px;" />
<input type="image" name="rptThreads$ctl01$imgbtn2" id="rptThreads_ctl01_imgbtn2" src="Images/misc/Rename.png" style="border-width:0px;" />
</div>
</div>
</td>
</tr>
<tr style="height:50px">
<td>
<div id="rptThreads_ctl02_titleContainer" style="position:absolute;">
<a id="rptThreads_ctl02_lnkTitle" style="float:left;padding-right:10px;">2</a>
<div id="rptThreads_ctl02_pnlEditButtons" style="vertical-align:middle;z-index:100;display:none;float:left;">
<input type="image" name="rptThreads$ctl02$imgbtn1" id="rptThreads_ctl02_imgbtn1" src="Images/misc/edit.png" style="border-width:0px;" />
<input type="image" name="rptThreads$ctl02$imgbtn2" id="rptThreads_ctl02_imgbtn2" src="Images/misc/Rename.png" style="border-width:0px;" />
</div>
</div>
</td>
</tr>
All divs get unique IDs, and this I do want
My questions are:
1)why it happens? why this line of code messup the ids?
2)how can have the unique ID's and assign javascript in codebehind?
I can add this on aspx (it will wotk and I will get unique ids):
onmouseover='<%# "javascript:ShowEditButtons(\""+ Container.FindControl("pnlEditButtons").ClientID+ "\");" %>'
But I must do it in codebehind because I need to set the javascript only if server validate some things.
Well as to why this is happening I'm not real sure. I suspect it may know that you used the ClientID so it didn't change it according to the naming container when the HTML was rendered.
As to what you can do to fix the problem, don't pass the ID to the javascript function. When an event fires in javascript the event object will be passed to the function for Firefox, IE has an explicit windows.event object. The event object will have a reference to the object that fired the event which you can then use to access the ID, but my guess is you were going to use the ID to get a reference to the element anyway.
An odd problem, can't say why this is happening, BUT... try moving this code to ItemDataBound instead of ItemCreated, I think you'll have more luck. I've written code exactly like this, but using OnItemDataBound and not had a problem.
Theoretically, any control inside a NamingContainer should get a unique ID, so there is definitely something fishy going on here.