I'm trying to populate a DropDownList on my editform (automatically generated), the only fancy thing is that I have 4 options to choose from and i dont want to create a table in a db just to bind it to that.
<telerik:RadGrid ID="RadGrid1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellSpacing="0" GridLines="None" PageSize="20" Skin="Forest">
<Columns>
<telerik:GridBoundColumn HeaderText="Discount" UniqueName="ColDiscount" />
<telerik:GridDropDownColumn HeaderText="Type" UniqueName="ColDType" >
</Columns>
</telerik:RadGrid>
CodeBehind:
Protected Sub RadGrid1_onitemdatabound(sender As Object, e As GridItemEventArgs) Handles RadGrid1.ItemDataBound
If e.Item.IsInEditMode Then
Dim item As GridEditableItem = DirectCast(e.Item, GridEditableItem)
If Not (TypeOf e.Item Is IGridInsertItem) Then
Dim combo As RadComboBox = DirectCast(item.FindControl("ColDType"), RadComboBox)
Dim selectedItem As New RadComboBoxItem()
selectedItem.Text = DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString()
selectedItem.Value = DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString()
selectedItem.Attributes.Add("coldtype", DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString())
combo.Items.Add(selectedItem)
selectedItem.DataBind()
End If
End If
End Sub
i tried this.
I tried populating it in the handler of the RadGrid1.ItemDataBound event and tried to find the dropdown control with DirectCast(item.FindControl("ColDType"), RadComboBox), but it came back as null so yeah, thats a thing. It couldn't find a ComboBox named ColDType on the autogenerated edit forms. Thats my best guess.
Your help is appreciated, thanks.
<telerik:RadGrid ID="RadGrid1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellSpacing="0" GridLines="None" PageSize="20" Skin="Forest">
<Columns>
<telerik:GridBoundColumn HeaderText="Discount" UniqueName="ColDiscount" />
<telerik:GridDropDownColumn HeaderText="Type" UniqueName="ColDType" >
</Columns>
</telerik:RadGrid>
CodeBehind:
Protected Sub RadGrid1_onitemdatabound(sender As Object, e As GridItemEventArgs) Handles RadGrid1.ItemDataBound
If e.Item.IsInEditMode Then
Dim item As GridEditableItem = DirectCast(e.Item, GridEditableItem)
If Not (TypeOf e.Item Is IGridInsertItem) Then
Dim combo As RadComboBox = DirectCast(item.FindControl("ColDType"), RadComboBox)
Dim selectedItem As New RadComboBoxItem()
selectedItem.Text = DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString()
selectedItem.Value = DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString()
selectedItem.Attributes.Add("coldtype", DirectCast(e.Item.DataItem, DataRowView)("ColDType").ToString())
combo.Items.Add(selectedItem)
selectedItem.DataBind()
End If
End If
End Sub
i tried this.
I tried populating it in the handler of the RadGrid1.ItemDataBound event and tried to find the dropdown control with DirectCast(item.FindControl("ColDType"), RadComboBox), but it came back as null so yeah, thats a thing. It couldn't find a ComboBox named ColDType on the autogenerated edit forms. Thats my best guess.
Your help is appreciated, thanks.
5 Answers, 1 is accepted
0
Jayesh Goyani
Top achievements
Rank 2
answered on 05 Aug 2012, 01:42 PM
Hello,
Please try with below code snippet.
Note : For Editmode="FormEdit" use GridEditFormItem
Thanks,
Jayesh Goyani
Please try with below code snippet.
protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e) { if (e.Item is GridEditableItem && e.Item.IsInEditMode) { GridEditableItem editItem = (GridEditableItem)e.Item; GridDropDownListColumnEditor dropDownEditor = (GridDropDownListColumnEditor)editItem.EditManager.GetColumnEditor("ColDType"); // columnuniquename //dropDownEditor.ComboBoxControl -- Access your control here //dropDownEditor.DropDownListControl -- Access your control here } }Note : For Editmode="FormEdit" use GridEditFormItem
Thanks,
Jayesh Goyani
0
Andris
Top achievements
Rank 1
answered on 08 Aug 2012, 07:42 PM
Thank you, this way I can populate the comboboxes on my editform.
My follow up question would be this:
I've populated my comboboxes, but the value selected does not get written back to the grid in a normal view (after i've accepted the changes) do i have to do it manually? after the user accepted the changes, do i have to modify the datasource of the grid to reflect the changes?
Thank you
My follow up question would be this:
I've populated my comboboxes, but the value selected does not get written back to the grid in a normal view (after i've accepted the changes) do i have to do it manually? after the user accepted the changes, do i have to modify the datasource of the grid to reflect the changes?
Thank you
0
Shinu
Top achievements
Rank 2
answered on 09 Aug 2012, 04:18 AM
Hi,
Try the following code snippet to show the GridDropDownColumn value in view mode.
C#:
Thanks,
Shinu.
Try the following code snippet to show the GridDropDownColumn value in view mode.
C#:
protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e){ if (e.Item is GridDataItem) { GridDataItem item = (GridDataItem)e.Item; DataRowView row = (DataRowView)e.Item.DataItem; item["ColDType"].Text = row["DataTextField"].ToString(); //For showing the GridDropDownColumn value in view mode. } if (e.Item is GridEditableItem && e.Item.IsInEditMode) { GridEditableItem editItem = (GridEditableItem)e.Item; GridDropDownListColumnEditor dropDownEditor = (GridDropDownListColumnEditor)editItem.EditManager.GetColumnEditor("ColDType"); // columnuniquename //your code }}Thanks,
Shinu.
0
Andris
Top achievements
Rank 1
answered on 10 Aug 2012, 07:48 PM
This is straight out of your documentation, yet it doesn't work (exception: index out of array bounds)
exception at this line:
Here's the full scenario we'd like to be able to do with a $1000 product:
we have a RadGrid with several columns (3 of the dropdowns with options, all of them universal to all rows, meaning i have to have those and exactly those options in their respective dropdownboxes for every row)
we have a DataSource, a DataTable in the variable Session("SessionData").
What we want to do, but seems impossible (and we are getting so nerve-racked about):
have the RadGrid load rows from the session variable. Display each field in its respective column of the row. That we know how to do.
We have 2 actions for each row: edit and delete. We were able to display those actions on the grid which is great.
Next: When we click the Edit button the RadGrid changes, it displays editable textboxes and dropdowns each with its respective name next to it. We are able to fill the DropDowns from a datasource. This is great, we are yet again one step closer.
Now when the user clicks the Accept text I assume that we need to update the datasource of the Grid (the Session variable) so when it fires the NeedDataSource event, it reloads into itself the correct values. How do we achieve that? We use the aforementioned UpdateCommand event. Which does not work, even though you yourself redirected us to it. All we did really was change the Datasource and the column name (based on which it should identify the row in the DataSource to update - or are we wrong here?). Yet....it.does.not.work. How come that editedItem.OwnerTableView.DataKeyValues collection is empty?
Let's proceed with the deletion of rows:
When the user clicks the delete button, the DeleteCommand event fires, we identify which row raised the event, identify the row within the DataSource (Session("SessionData")), delete the row so that when the action completes and the Grid rebinds itself (because it should) then it would reload the session variable, but because we deleted the row the user wanted, it would be simply not be loaded into the Grid again.
And well, thats all we really want. Please help us with either explaining or through detailed (working) examples, because we need to account for that $1000 dollars we spent on your product.
So far your support makes it worth it. So far.
Thank you in advance.
Protected Sub Products_UpdateCommand(sender As Object, e As GridCommandEventArgs) Handles Products.UpdateCommand Dim editedItem As GridEditableItem = TryCast(e.Item, GridEditableItem) Dim ordersTable As DataTable = TryCast(Session("SessionData"), DataTable) Dim changedRows As DataRow() = ordersTable.Select("ProductID= " + editedItem.OwnerTableView.DataKeyValues(editedItem.ItemIndex)("ProductID").ToString()) If changedRows.Length <> 1 Then MsgBox("Unable to locate the Order for updating.") e.Canceled = True Return End If Dim newValues As New Hashtable() e.Item.OwnerTableView.ExtractValuesFromItem(newValues, editedItem) changedRows(0).BeginEdit() Try For Each entry As DictionaryEntry In newValues changedRows(0)(DirectCast(entry.Key, String)) = entry.Value Next changedRows(0).EndEdit() Catch ex As Exception changedRows(0).CancelEdit() MsgBox("Unable to update Orders. Reason: " + ex.Message) e.Canceled = True End Try End Subexception at this line:
Dim changedRows As DataRow() = ordersTable.Select("ProductID= " + editedItem.OwnerTableView.DataKeyValues(editedItem.ItemIndex)("ProductID").ToString())
Here's the full scenario we'd like to be able to do with a $1000 product:
we have a RadGrid with several columns (3 of the dropdowns with options, all of them universal to all rows, meaning i have to have those and exactly those options in their respective dropdownboxes for every row)
we have a DataSource, a DataTable in the variable Session("SessionData").
What we want to do, but seems impossible (and we are getting so nerve-racked about):
have the RadGrid load rows from the session variable. Display each field in its respective column of the row. That we know how to do.
Protected Sub Products_NeedDataSource(sender As Object, e As GridNeedDataSourceEventArgs) Handles Products.NeedDataSource Products.DataSource = TryCast(Session("SessionData"), DataTable) End SubWe have 2 actions for each row: edit and delete. We were able to display those actions on the grid which is great.
Next: When we click the Edit button the RadGrid changes, it displays editable textboxes and dropdowns each with its respective name next to it. We are able to fill the DropDowns from a datasource. This is great, we are yet again one step closer.
Now when the user clicks the Accept text I assume that we need to update the datasource of the Grid (the Session variable) so when it fires the NeedDataSource event, it reloads into itself the correct values. How do we achieve that? We use the aforementioned UpdateCommand event. Which does not work, even though you yourself redirected us to it. All we did really was change the Datasource and the column name (based on which it should identify the row in the DataSource to update - or are we wrong here?). Yet....it.does.not.work. How come that editedItem.OwnerTableView.DataKeyValues collection is empty?
Let's proceed with the deletion of rows:
When the user clicks the delete button, the DeleteCommand event fires, we identify which row raised the event, identify the row within the DataSource (Session("SessionData")), delete the row so that when the action completes and the Grid rebinds itself (because it should) then it would reload the session variable, but because we deleted the row the user wanted, it would be simply not be loaded into the Grid again.
And well, thats all we really want. Please help us with either explaining or through detailed (working) examples, because we need to account for that $1000 dollars we spent on your product.
So far your support makes it worth it. So far.
Thank you in advance.
0
Shinu
Top achievements
Rank 2
answered on 05 Sep 2012, 06:53 AM
Hi,
Unfortunately I couldn't replicate the issue. I tried the same scenario and its working fine at my end. Here is the sample code I tried.
ASPX:
VB:
Thanks,
Shinu.
Unfortunately I couldn't replicate the issue. I tried the same scenario and its working fine at my end. Here is the sample code I tried.
ASPX:
<telerik:RadGrid ID="RadGrid1" runat="server" onneeddatasource="RadGrid1_NeedDataSource" AutoGenerateColumns="false" AutoGenerateEditColumn="true" onupdatecommand="RadGrid1_UpdateCommand"> <MasterTableView DataKeyNames="OrderID"> <Columns> <telerik:GridBoundColumn UniqueName="EmployeeID" DataField="EmployeeID"></telerik:GridBoundColumn> <telerik:GridBoundColumn UniqueName="CustomerID" DataField="CustomerID"></telerik:GridBoundColumn> </Columns> </MasterTableView></telerik:RadGrid>VB:
Public Shared connection As String = WebConfigurationManager.ConnectionStrings("NorthwindConnectionString3").ConnectionStringPrivate conn As New SqlConnection(connection)Public SqlCommand As New SqlCommand()Protected Sub Page_Load(sender As Object, e As EventArgs) If Not IsPostBack Then Dim selectQuery1 As String = "select top 10 OrderID,EmployeeID,CustomerID from Orders" Dim adapter1 As New SqlDataAdapter(selectQuery1, conn) Dim dt1 As New DataTable() conn.Open() adapter1.Fill(dt1) conn.Close() Session("SessionData") = dt1 End IfEnd SubProtected Sub RadGrid1_NeedDataSource(sender As Object, e As Telerik.Web.UI.GridNeedDataSourceEventArgs) RadGrid1.DataSource = Session("SessionData")End SubProtected Sub RadGrid1_UpdateCommand(sender As Object, e As Telerik.Web.UI.GridCommandEventArgs) Dim editedItem As GridEditableItem = TryCast(e.Item, GridEditableItem) Dim ordersTable As DataTable = TryCast(Session("SessionData"), DataTable) Dim changedRows As DataRow() = ordersTable.[Select]("OrderID= " + editedItem.OwnerTableView.DataKeyValues(editedItem.ItemIndex)("OrderID").ToString()) If changedRows.Length <> 1 Then Interaction.MsgBox("Unable to locate the Order for updating.") e.Canceled = True Return End If Dim newValues As New Hashtable() e.Item.OwnerTableView.ExtractValuesFromItem(newValues, editedItem) changedRows(0).BeginEdit() Try For Each entry As DictionaryEntry In newValues changedRows(0)(DirectCast(entry.Key, String)) = entry.Value Next changedRows(0).EndEdit() Catch ex As Exception changedRows(0).CancelEdit() Interaction.MsgBox("Unable to update Orders. Reason: " + ex.Message) e.Canceled = True End TryEnd SubThanks,
Shinu.