This is a migrated thread and some comments may be shown as answers.

Unable to save when Updating / Inserting in Grid

1 Answer 116 Views
Grid
This is a migrated thread and some comments may be shown as answers.
David
Top achievements
Rank 1
David asked on 13 Feb 2015, 05:11 PM
I have had to make changes to my FormTemplate fields to keep it from getting an error.
I believe it is because I have changed the fields from using selectedvalue and checked
set to a BIND to using Eval expressions. After making these changes when in edit mode
any changes put into the template fields don't seem to be populating the GridEditableItem
which I believe is the reason for the saves not going to the database now. If I remove
everything under the EditSettings then the grid goes back to successfully saving the 
changes to the database. Below is both my markup and code behind. I can't hitting roadblock 
after roadblock. Any help would be much appreciated?

Markup code: 
<div class="WebpageManagementBox">
       
        <br /><br />
        <asp:Label ID="lblRolePrompt" Text="Select Role to associate web pages:" CssClass="box_Labels" runat="server"></asp:Label>
        <br />
        <telerik:RadDropDownList ID="ddlRoles" runat="server" CssClass="wepageManagementDropDown" Width="200px" DataTextField="role" DataValueField="ID" AutoPostBack="true" OnItemSelected="ddlRoles_ItemSelected"></telerik:RadDropDownList>
        <br />
        <br />
        <telerik:RadGrid ID="RadGridwebpagemanagement" CssClass="webpageManagementGrid" MasterTableView-DataKeyNames="ID" runat="server"
            AllowFilteringByColumn="True" AllowSorting="True"
            GroupPanelPosition="Top" 
            OnNeedDataSource="RadGridwebpagemanagement_NeedDataSource"
            OnUpdateCommand="RadGridwebpagemanagement_UpdateCommand" OnItemDataBound="RadGridwebpagemanagement_ItemDataBound" OnDeleteCommand="RadGridwebpagemanagement_DeleteCommand" OnInsertCommand="RadGridwebpagemanagement_InsertCommand">
            <ClientSettings>
                <Scrolling AllowScroll="True" UseStaticHeaders="True" />
                <Selecting AllowRowSelect="true" />
            </ClientSettings>
            <GroupingSettings CaseSensitive="false" />
            <MasterTableView AutoGenerateColumns="false" CommandItemDisplay="Top" CommandItemSettings-AddNewRecordText="Add New Webpage" 
                 InsertItemPageIndexAction="ShowItemOnCurrentPage">
 
                <columns>
                     
                    <telerik:GridBoundColumn DataField="webpage_name" HeaderText="Web Page" UniqueName="webpage_name" ItemStyle-Font-Names="Arial" ItemStyle-Font-Bold="true"
                                FilterControlWidth="200px">
                                <HeaderStyle Width="230px" Font-Names="Arial" />
                                <ItemStyle Width="230px" />
                    </telerik:GridBoundColumn>
                    
                    <telerik:GridCheckBoxColumn DataField="add_privledge" HeaderText="Allow Adds" UniqueName="add_privledge"
                                FilterControlWidth="120px">               
                                <HeaderStyle Width="120px" Font-Names="Arial" />
                                <ItemStyle Width="120px" />
                    </telerik:GridCheckBoxColumn>
                     
                    <telerik:GridCheckBoxColumn DataField="edit_privledge" HeaderText="Allow Edits" UniqueName="edit_privledge"
                                FilterControlWidth="120px">               
                                <HeaderStyle Width="120px" Font-Names="Arial" />
                                <ItemStyle Width="120px" />
                   </telerik:GridCheckBoxColumn>
 
                     <telerik:GridCheckBoxColumn DataField="delete_privledge" HeaderText="Allow Deletes" UniqueName="delete_privledge"
                              FilterControlWidth="120px">               
                                <HeaderStyle Width="120px" Font-Names="Arial" />
                                <ItemStyle Width="120px" />
                    </telerik:GridCheckBoxColumn>                  
 
                   <telerik:GridEditCommandColumn ButtonType="LinkButton" EditText="Edit" CancelText="Cancel" ItemStyle-Width="50px" HeaderStyle-Width="50px" FilterControlWidth="50px" />
                   <telerik:GridButtonColumn ConfirmText="Delete this product?" ConfirmDialogType="RadWindow"
                        ConfirmTitle="Delete" ButtonType="LinkButton" Text="Delete" CommandName="Delete" ItemStyle-Width="50px" HeaderStyle-Width="50px" FilterControlWidth="50px" />
                     
                </columns>
                
                <EditFormSettings EditFormType="Template">
                <FormTemplate>   
                    
                   
                    <div id="divGridEdit" class="divGrid">
                            <b>Add New Role to Webpage Association</b>
                            <br /><br />
                            <table>
 
                                <tr>
                                    <td><asp:Label Text="Web Page:" runat="server"></asp:Label></td>
                                    <td>
                                         <asp:DropDownList ID="ddlWebPages" DataSourceID="sqlDataSourceWebpages" AppendDataBoundItems="True" DataTextField="webpage_name" DataValueField="ID"
                                               SelectedValue='<%# DataBinder.Eval(Container.DataItem,"security_webpage_id") == DBNull.Value ? "" : DataBinder.Eval(Container.DataItem,"security_webpage_id") %>'
                                                runat="server"> 
                                                <asp:ListItem Value=""></asp:ListItem>
                                         </asp:DropDownList>
 
                                    </td>
                                </tr>
                                
                                <tr>
                                    <td><br /></td>
                                    <td></td>
                                </tr>
                                <tr>
                                     <td><asp:Label Text="Allow Add:" runat="server"></asp:Label></td>
                                     <td><asp:CheckBox ID="chkboxAllowAdd" Checked='<%# DataBinder.Eval(Container.DataItem,"add_privledge") == DBNull.Value ? false : DataBinder.Eval(Container.DataItem,"add_privledge") %>' runat="server" /></td>
                                </tr>
                                <tr>
                                     <td><asp:Label Text="Allow Edit:" runat="server"></asp:Label></td>
                                     <td><asp:CheckBox ID="chkboxAllowEdit" Checked='<%# DataBinder.Eval(Container.DataItem,"edit_privledge") == DBNull.Value ? false : DataBinder.Eval(Container.DataItem,"edit_privledge") %>' runat="server" /></td>
                                </tr>
                                <tr>
                                     <td><asp:Label Text="Allow Delete:" runat="server"></asp:Label></td>
                                     <td><asp:CheckBox ID="chkboxDelete" Checked='<%# DataBinder.Eval(Container.DataItem,"delete_privledge") == DBNull.Value ? false : DataBinder.Eval(Container.DataItem,"delete_privledge") %>' runat="server" /></td>
                                </tr>
 
                                <tr>
                                    <td><asp:Button ID="btnUpdate" Text='<%# (Container is GridEditFormInsertItem) ? "Insert" : "Update" %>'
                                        CommandName='<%# (Container is GridEditFormInsertItem) ? "PerformInsert" : "Update" %>'  runat="server" /></td>
                                    <td><asp:Button ID="btnCancel" Text="Cancel" runat="server" CommandName="Cancel" CausesValidation="false" /></td>
                                </tr>
                            </table>
                        </div>            
 
                </FormTemplate>
            </EditFormSettings>
 
 
            </MasterTableView>
            <ClientSettings>
                <ClientEvents OnRowDblClick="rowDblClick" />
            </ClientSettings>
                
        </telerik:RadGrid>
 
 
    </div>
 
    <asp:SqlDataSource ID="sqlDataSourceWebpages" runat="server" SelectCommand="SELECT * FROM dbo.security_webpage" ConnectionString="<%$ ConnectionStrings:GATEConnectionString %>"></asp:SqlDataSource>
 
    <telerik:RadWindowManager ID="RadWindowManager1" runat="server" />

Code Behind:

using GATE_Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
 
 
namespace FRC
{
    public partial class WebPageManagemet : System.Web.UI.Page
    {
 
        
        protected void Page_Load(object sender, EventArgs e)
        {
             
            
 
            if (!IsPostBack)
            {
                 
                GATEEntities dbContext = new GATEEntities();
             
                // Load Role Drop-down List
                var rolequery = from r in dbContext.Security_Role
                                select r;
 
                IEnumerable<Security_Role> roles = rolequery.ToList();
                ddlRoles.DataSource = roles;
                ddlRoles.DataBind();              
 
            }
            
        }
 
        protected void RadGridwebpagemanagement_NeedDataSource(object sender, Telerik.Web.UI.GridNeedDataSourceEventArgs e)
        {
           
 
            int? selectedroleid = Convert.ToInt32(ddlRoles.SelectedValue);
 
            // Use LINQ query to populate radGrid
            GATEEntities dbContext = new GATEEntities();
 
            var query = from srw in dbContext.Security_Role_To_Webpage
                        join sw in dbContext.Security_Webpage on srw.security_webpage_id equals sw.ID
                        where srw.security_role_id == selectedroleid
                        select new
                        {
                            srw.ID,
                            srw.security_webpage_id,
                            sw.webpage_name,
                            srw.add_privledge,
                            srw.edit_privledge,
                            srw.delete_privledge,
                            srw.view_privledge
                         
                        };
 
            //IEnumerable<Security_Role_To_Webpage> securitypages = query.ToList();
 
            RadGridwebpagemanagement.DataSource = query.ToList();
                      
 
        }
 
        protected void ddlRoles_ItemSelected(object sender, Telerik.Web.UI.DropDownListEventArgs e)
        {
            RadGridwebpagemanagement.Rebind();
        }
 
        
 
        protected void RadGridwebpagemanagement_ItemDataBound(object sender, GridItemEventArgs e)
        {
             
            if (e.Item.FindControl("ddlWebPages") != null )
            {
                GridEditableItem editedItem = e.Item as GridEditableItem;
                DropDownList _ddl = (DropDownList)e.Item.FindControl("ddlWebPages");
                if (_ddl != null)
                {
                    _ddl.DataSourceID = "";
                    _ddl.Items.Clear();
                    ListItem newitem = new ListItem("","");
                    _ddl.Items.Add(newitem);
                    _ddl.DataSource = this.sqlDataSourceWebpages;
                    _ddl.DataTextField = "webpage_name";
                    _ddl.DataValueField = "ID";
                    _ddl.DataBind();
                     
                }
            }
            
 
        }
 
        protected void RadGridwebpagemanagement_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            GATE_Entity.GATEEntities dbContext = new GATEEntities();
 
            var editableItem = ((GridEditableItem)e.Item);
            var lookupID = (int)editableItem.GetDataKeyValue("ID");
 
            // Retrieve Entity
            var webpagerecord = dbContext.Security_Role_To_Webpage.Where(n => n.ID == lookupID).FirstOrDefault();
 
            if (webpagerecord != null)
            {
                // set for deletion
                dbContext.Security_Role_To_Webpage.Remove(webpagerecord);
                 
                try
                {
 
                    // Save changes to db
                    dbContext.SaveChanges();
 
                }
                catch (System.Exception)
                {
 
                }
 
            }
 
        }
        private void DisplayMessage(string text)
        {
            RadGridwebpagemanagement.Controls.Add(new LiteralControl(string.Format("<span style='color:red'>{0}</span>", text)));
        }
        protected void RadGridwebpagemanagement_UpdateCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
        {
 
            GATEEntities dbContext = new GATEEntities();
 
            var editableItem = ((GridEditableItem)e.Item);
            var lookupID = (int)editableItem.GetDataKeyValue("ID");
 
             
            DropDownList ddlwebpage = (DropDownList)editableItem.FindControl("ddlWebPages");
            var selectedval = Convert.ToInt32(ddlwebpage.SelectedValue);
 
            // Check to make sure user didn't select webpage for this role that is already within the role
 
            var roleid = Convert.ToInt32(ddlRoles.SelectedValue);
            var webpagerecexist = (from srw in dbContext.Security_Role_To_Webpage
                                  where srw.security_role_id == roleid &&
                                  srw.security_webpage_id == selectedval &&
                                  srw.ID != lookupID
                                  select srw).ToList();
 
 
            // If Count > 0 then user chose drop down webpage that is already associated with role
            if (webpagerecexist.Count == 0)
            {
             
                // create sql criteria with which the changes will be applied to
                var webpagerecord = dbContext.Security_Role_To_Webpage.Where(n => n.ID == lookupID).FirstOrDefault();
 
                if (webpagerecord != null)
                {
                    // update entity's state
                    editableItem.UpdateValues(webpagerecord);
 
                    try
                    {
 
                        // Save changes to db
                        dbContext.SaveChanges();
 
                    }
                    catch (System.Exception)
                    {
 
                    }
 
                }
            }          
            else
            {
 
                DisplayMessage("The webpage you selected already exists for this role!");
                // keep in update mode
                e.Canceled = true;
 
 
 
            }
        
 
        }
 
        protected void RadGridwebpagemanagement_InsertCommand(object sender, GridCommandEventArgs e)
        {
 
            GATEEntities dbContext = new GATEEntities();
 
            var editableItem = ((GridEditableItem)e.Item);
 
            Hashtable values = new Hashtable();
 
            editableItem.ExtractValues(values);
 
            var newrec = dbContext.Security_Role_To_Webpage.Create();
 
 
            newrec.security_webpage_id = (int?)values["security_webpage_id"];
            newrec.security_role_id = (int?)values["security_role_id"];
            newrec.add_privledge = (bool?)values["add_privledge"];
            newrec.edit_privledge = (bool?)values["edit_privledge"];
            newrec.delete_privledge = (bool?)values["delete_privledge"];
 
            dbContext.SaveChanges();
             
 
        }
 
 
 
 
    }
}

1 Answer, 1 is accepted

Sort by
0
Viktor Tachev
Telerik team
answered on 16 Feb 2015, 11:39 AM
Hello David,

I have replied to your query in the support ticket you have submitted. I suggest we continue the conversation there.

In case someone from the community is experiencing similar issue I will also post the reply here.

Have in mind that Eval function is used for one-way binding. This is useful for read-only values. When you would like to use two-way (updatable) binding you should use Bind. Check out the following article that describes the two function in more detail.

Also, if you would like a live illustration on how FormTemplate can be used in RadGrid, you would find the following online demo interesting:



Regards,
Viktor Tachev
Telerik
 

Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

 
Tags
Grid
Asked by
David
Top achievements
Rank 1
Answers by
Viktor Tachev
Telerik team
Share this question
or