.net - How To Add Event Handler To DropDownList Inside GridView
May 3, 2010
I have DropDownList inside GridView. Now I would like to add event handler for dropdownlist which would react on SelectedIndexChanged.I'm nesting DropDownList inside GridView by using RowDataBound event for GridView.(http://www.highoncoding.com/Articles/169_DropDownList_Inside_GridView__Method_1_.aspx) and tell me how to add event handling for dropdownlist
I have an UpdatePanel with a GridView. This GridView has a template column that is a DropDownList. The problem is that the SelectedIndexChanged event does not fire for the DropDownList. Here is the code:
I have placed a dropdown list in Gridview footer, now i want to access the dropdown selected indeex changed event as below. But i'm not able to access the event.
protected void ddlCatg_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddlCategories = grvExpenses.FooterRow.FindControl("ddlCatg") as DropDownList; DropDownList ddlExpenseSubCategories = grvExpenses.FooterRow.FindControl("ddlSubCatg") as DropDownList; ddlExpenseSubCategories.Items.Clear();
I have a page that contains dynamically generated Dropdown List controls and I want thant the dynamic dropdown list perform an AutoPostback to fill some other field using the value selected. This is the code I'm using to create dynamically the control:
[Code]....
Control is correctly filled and rendered on ASP page but, after selecting a value, the page is reloaded (AutoPostBack is called) but the control is not diplayed and the sub is not called. I put a breakpoint into the ChangeValue sub but anything happens.
I read on some post that handler for the first DropDownList is not necessary but, how is it possible to tell DropDownList to call my sub after changevalue?
Protected Sub ddl_selectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Dim a As String = "" 'this does not get fired End Sub <asp:GridView ID="GridViewAssignment" runat="server" BackColor="White" BorderColor="White" BorderStyle="Ridge" BorderWidth="2px" CellPadding="3" CellSpacing="1" GridLines="None" Width="100%"> <RowStyle BackColor="#DEDFDE" ForeColor="Black" /> <FooterStyle BackColor="#C6C3C6" ForeColor="Black" /> <PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" /> <SelectedRowStyle BackColor="#86A4CA" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#808080" Font-Bold="True" ForeColor="#E7E7FF" /> </asp:GridView> Protected Sub GridViewAssignment_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridViewAssignment.RowDataBound Dim dateApplicationCreatedCell As TableCell = e.Row.Cells(0) 'app created on Dim typeOfReview As TableCell = e.Row.Cells(7) 'type Dim QCCell As TableCell = e.Row.Cells(8) 'qc Dim dateReviewAssignedCell As TableCell = e.Row.Cells(9) 'date assigned Dim reviewerNameCell As TableCell = e.Row.Cells(10) 'reviewer Dim dateReviewCompletedCell As TableCell = e.Row.Cells(11) 'date completed review Dim ddl As DropDownList If e.Row.RowIndex <> -1 Then If dateReviewAssignedCell.Text.Trim = " " Then dateReviewAssignedCell.Text = Now.Date End If Dim sqlCondition As String = String.Empty If dateReviewCompletedCell.Text.Trim = " " Then Dim nameToSelect As String If reviewerNameCell.Text.Trim <> " " Then Dim dateReviewAssigned As Date = dateReviewAssignedCell.Text Dim elapsedSinceAssigned As Long = DateDiff(DateInterval.Day, dateReviewAssigned.Date, Now.Date, Microsoft.VisualBasic.FirstDayOfWeek.Monday, FirstWeekOfYear.Jan1)...............................
I understand I need to load my dynmaic control on every postback and preferrably in Page_Init(). But my dyanmic controls are loaded from a dropdownlist selectedindexchanged event handler. Now after any postback, my dynamic controls are gone. How would I force it to load on every postback ?
I'm trying to load a gridview based on selection from dropdownlist. When i run the program, it displays empty gridview. How to solve this?
Name of dropdownlist: CatCode
Code behind:
Private Sub BindProdGrid() Dim conString As String = ConfigurationManager.ConnectionStrings("SY_InventoryConnectionString").ConnectionString Dim rowIndex As Integer = 0 Dim box11 As DropDownList = CType(SalesGView.Rows(rowIndex).Cells(1).FindControl("CatCode"), DropDownList)
Is there a technical reason for the existence of Page.PreLoad or is this just convenience to have a place where you can neatly place code that always have to be executed before the Load code? Is there a difference between adding code in the PreLoad event handler and adding code at the top of the Load event handler? And what would be a typical scenario where you use PreLoad?
This is a weird issue. I have a List view with 2 Link buttons. "Edit" and "Delete" Iam able to attach an event handler for the first linkbutton(Update). Code in the event handler executed fine. But If I try to attach a event handler for the second link button(Delete) , I get an error.
My Item Template Looks like this.
[Code]....
First Item works absolutely fine. But If I attach the second handler, I get the following error
Am I missing some thing ? Note - There is no error if I try to attach the 1st event handler to the second link button.[ie EditLinkButtonClicked to DeleteLinkButtonClicked ] Issue occurs only when I try to attach DeleteLinkButtonClicked to DeleteLinkButton
I've tried many different ways to try to get the selectedIndexChange to work for my dropdownlist. It doesn't seem to work, when I debug, I can see that the page is doing a PostBack but the method that suppose to be taking care of the select index change doesn't seems to be fired. I notice that there is no "handles" in many post so I was just wondering why it doesn't have it?On postBack I didn't rebuild the list so the selectedIndexChange value shouldn't reset to 0.Sub ddlAccess_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) ''handles ......?" ...
I would like to call a method and pass a value to it on a link button autogenerated from the database in a templatefield inside a datagrid. I don't know much about delegates
running the website and viewing the page source, I have realised that there is an OnClick event created for the linkbutton, however, this may be generated anyways. By running my solution using VS debugging, I can see that my method won't fire by clicking any of thos generated linkbuttons.
I have a dropdownlist inside a formview and I'm trying to do something on the selectedindexchanged event. but I'm getting the following error:
It looks like it can't find the dropdownlist because it is inside the formview. How can I find the event?- if there is such a thing.
Server Error in '/WebSite4' Application. Compilation Error Description:
An error occurred during the compilation of a resource required to service this request.
review the following specific error details and modify your source code appropriately. Compiler Error Message: BC30506: Handles clause requires a WithEvents variable defined in the containing type or one of its base types.
Source Error:
[Code]....
Line 13:End If Line 14:End Sub Line 15:Protected Sub ddlDept_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlDept.SelectedIndexChanged Line 16: Dim ComDropDownList As DropDownList = CType(FormView1.FindControl("ddlCommune"), DropDownList) Line 17:
what i m trying is i hav two dropdownlists inside the gridview... namely say ddonsiteoffsite and ddhours... now what i want is if the selectedtext of ddonsiteoffsite is "onsite" the ddhours should b disabled... i tried the code snippet but ... its not disabling the ddhours... can someone help me please..
I have a GridView control that contians, among other things, a DropDownList. In this particular case, the DropDownList is in the EmptyDataTemplate, but I suspect I will run into a similar situation when I'm in Data Rows as well.I'm trying to handle the OnSelectedIndexChanged event for the DropDownList and in the .aspx file I have used the declarative syntax to assign the handler OnSelectedIndexChanged="ddlStoreList_SelectedIndexChanged") and have created the handler code to deal with this.
[Code]....
The problem that I'm running into is that the event is not being handled. In other words, when I put a breakpoint in the handler, I find that it is not getting hit when I change the selection of the DropDownList.
I use this code to obtain a selected data from GridView control. I created a user control and reference it to ASPX page. However, for some reason I can not access public methods IndexChanged to retrieve information of selected line.
* User controls: * Public gridRow As GridViewRow Public Event IndexChanged As GridViewSelectEventHandler * Protected Sub GridView_SelectedIndexChanged (sender As Object, e As EventArgs) Handles gv.SelectedIndexChanged ******* gridRow = Grid.SelectedRow ******* RaiseEvent IndexChanged (sender, e) End Sub *
ASPX page: * * grid.IndexChanged - there is no such event in the selection (the grid is the name of the user control)
I have gridview in my page that users can edit their data in gridview... and in this gridview I define label that I want when users click on Edit button it change label3.text:
I want to add an event handeler that tell me wich row had been selected and highlighted it too. I tried many times, but usually face this error "No overload for 'Grd_ServersInfo_CheckSelectedRow' matches delegate 'System.EventHandler' ". Could any one paste the right code lines to handel this event
I'm creating a GridView in code. I can successfully attach handlers for Editing, and CancelEditing. RowUpdating never runs, however. Instead, if the GridView is in a Panel, the Edit handler is called when Update is clicked (and this is the command name I get back on the Update click, too). If the GridView is not in a panel, then the Cancel handler is called when Update is clicked (again, this is the command name I get back from clicking Update). I've searched high and low for a reason why the RowUpdating event is not getting called, and I can't find one. Does anyone out there haveHere is my code (My actual code is much more involved than this, but for testing purposes, I extracted the following code and stuck it in a new project to isolate my problem):
protected void Page_Init(object sender, EventArgs e) { if (!IsPostBack)
I am trying to capture the SelectedIndexChanged event for a drop down list I have put inside of a gridview control. It posts back fine, but does not go into my SelectedIndexChanged event handler. Here is my code
[Code]....
it is still not going into my myddl_SelectedIndexChanged() eventhandler.
I wanted to get the total row count in a GridView's databound event handler, so I tried the following:
protected void grid_DataBound(object sender, EventArgs e) { GridView grid = (GridView)sender; DataSet data = grid.DataSource as DataSet; if (data == null) return; int totalRows = data.Tables[0].Rows.Count; }
The problem is that the grid.DataSource property is null. The DataSourceID property is not null, so does that mean that I can't access the DataSource object in the DataBound event handler unless I assign the DataSource property directly?
Edit1: Here is the code in my GridHelper class for adding rowcount to the BottomPagerRow. I would like to get rid of the requirement to pass in the ObjectDataSource, but can't because I need to use the Selected event to get total row count. Hence the reason for the question. I also think this might be better in a custom control where I can access ViewState, and/or create child controls during the Init event (I still have a problem to resolve with the way the pager renders with an extra cell), but then I'd still have the problem of how to get to the total row count when the DataSource itself doesn't appear to be available in any GridView events.
Edit 2: Not really relevant to the specific problem, but I resolved the problem I was having with the pager rendering so i've updated the code posted. I found the trick here: [URL]
#region Fields private int totalRows = -1; #endregion #region Constructors /// <summary> /// Initializes a new instance of the <see cref="GridHelper"/> class. /// Adds EventHandlers to the GridView to display results from the ObjectDataSource in the footer. /// Marked as obsolete because AddResultsToFooter method provides a static access to the same functionality /// An instance of GridHelper is required by the passed in GridView to store the totalRows value between the two event handlers /// </summary> /// <param name="grid">The grid.</param> /// <param name="source">The ObjectDataSource linked to the GridView.</param> [Obsolete("Use AddResultsToFooter instead.")] [EditorBrowsable(EditorBrowsableState.Never)] public GridHelper(GridView grid, ObjectDataSource source) { source.Selected += source_Selected; grid.PreRender += grid_PreRender; } #endregion #region Event Handlers private void grid_PreRender(object sender, EventArgs e) { GridView grid = (GridView)sender; if (grid.HeaderRow != null) grid.HeaderRow.TableSection = TableRowSection.TableHeader; //Add a cell to the bottom pager row to display the total results if (grid.BottomPagerRow == null || !grid.BottomPagerRow.Visible) return; //Get the control used to render the pager //http://michaelmerrell.com/2010/01/dynamically-modifying-the-asp-net-gridview-paging-control/ Table tblPager = grid.BottomPagerRow.Cells[0].Controls[0] as Table; if (tblPager == null) return; if (totalRows < 0) { //The DataSource has not been refreshed so get totalRows from round trip to client addResultsToPagerTable(tblPager, grid.Attributes["results"]); return; } int firstRow = grid.PageIndex * grid.PageSize + 1; int lastRow = firstRow + grid.Rows.Count - 1; string results; if (totalRows <= grid.PageSize) results = string.Format("<span class='grid-pager'>{0} Results</span>", totalRows); else results = string.Format("Results <b>{0}</b> to <b>{1}</b> of <b>{2}</b>", firstRow, lastRow, totalRows); addResultsToPagerTable(tblPager, results); //Need to store the information somewhere that is persisted via ViewState, and we don't have access to ViewState here grid.Attributes.Add("results", results); } /// <summary> /// Handles the Selected event of the source control. Gets the total rows, since it is not possible to access them from the GridView. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs"/> instance containing the event data.</param> private void source_Selected(object sender, ObjectDataSourceStatusEventArgs e) { if (e.ReturnValue is DataView) totalRows = ((DataView)e.ReturnValue).Count; else if (e.ReturnValue is EntitySet) totalRows = ((EntitySet)e.ReturnValue).Count; } #endregion #region Private Methods private static void addResultsToPagerTable(Table tblPager, string results) { //http://michaelmerrell.com/2010/01/dynamically-modifying-the-asp-net-gridview-paging-control/ //Get a handle to the original pager row TableRow pagesTableRow = tblPager.Rows[0]; //Add enough cells to make the pager row bigger than the label we're adding while (pagesTableRow.Cells.Count < 10) pagesTableRow.Cells.Add(new TableCell { BorderStyle = BorderStyle.None }); //Add a new cell in a new row to the table TableRow newTableRow = new TableRow(); newTableRow.Cells.AddAt(0, new TableCell { Text = results, BorderStyle = BorderStyle.None, ColumnSpan = pagesTableRow.Cells.Count }); tblPager.Rows.AddAt(0, newTableRow); } #endregion #region Public Methods /// <summary> /// Adds EventHandlers to the GridView to display results from the ObjectDataSource in the footer. /// </summary> /// <param name="grid">The GridView.</param> /// <param name="source">The ObjectDataSource linked to the GridView.</param> public static void AddResultsToFooter(GridView grid, ObjectDataSource source) { if (grid == null) throw new ArgumentNullException("grid", "grid is null."); if (source == null) throw new ArgumentNullException("source", "source is null."); new GridHelper(grid, source); } #endregion