Bind Combobox ID to names

4 posts, 0 answers
  1. Igor
    Igor avatar
    6 posts
    Member since:
    Jun 2019

    Posted 16 Oct 2019 Link to this post

    Hello 

    I am using RadGrid, which is using BatchEditing. I am using RadComboBox in a column, which is using LoadOnDemand.

    This column is showing PROJECT_ID value in the grid. What I need to do, is to bind Column to show PROJECT_NAME.

    Because of optimization, I cannot load PROJECT_NAME as a hidden column to the grid or something like that.

    I need some Data source where I will have combinations PROJECT_ID  -> PROJECT_NAME and bind it to the column.

    This is a solution we are using in different systems.

    It is this achievable in Telerik RadGrid and RadCombobox?

    Stripped demo code:

    ASPX:

    <%@ Page Title="Test Page" Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="TimeReport.Web.Pages.WebForm2" MasterPageFile="~/MasterPage.master" %>
    <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %>
     
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"
       <link href="/Styles/mail.css" rel="stylesheet" />
    </asp:Content>
     
    <asp:Content ID="Content3" ContentPlaceHolderID="MainContent"   runat="Server">
       <asp:Label CssClass="header" ID="Label1" runat="server" Text="content3" />
       <telerik:RadGrid ID="RadGrid1" runat="server" AllowAutomaticDeletes="True" OnNeedDataSource="messages_NeedDataSource"
        AllowAutomaticInserts="True"
         AllowAutomaticUpdates="True" AllowPaging="True"
        AutoGenerateColumns="False"   PageSize="20"
               
        Width="100%"
        Height="100%"
        Style="border: 0; outline: none" AllowSorting="True">
        <MasterTableView CommandItemDisplay="Top" DataKeyNames="PERSON_ACTIVITY_ID"
          HorizontalAlign="NotSet" EditMode="Batch" AutoGenerateColumns="False"
          TableLayout="Fixed">
          <BatchEditingSettings EditType="Cell" HighlightDeletedRows="true" OpenEditingEvent="DblClick" />
          <SortExpressions>
            <telerik:GridSortExpression FieldName="PERSON_ACTIVITY_ID" SortOrder="Descending" />
          </SortExpressions>
          <CommandItemSettings ShowExportToExcelButton="True" ShowExportToPdfButton="True" />
          <Columns>
             <telerik:GridTemplateColumn HeaderText="Projekt" UniqueName="PROJECT_ID" DataField="PROJECT_ID" SortExpression="PROJECT_ID" HeaderStyle-Width="15%" ItemStyle-Width="15%"  >
              <ItemTemplate>
                <%#DataBinder.Eval(Container.DataItem, "PROJECT_ID")%>
              </ItemTemplate>
              <EditItemTemplate>
                <telerik:RadComboBox RenderMode="Lightweight" runat="server" ID="GCB_Project" ShowMoreResultsBox="true" EnableVirtualScrolling="true"
                  OnItemsRequested="PROJECT_ItemsRequested1" EnableLoadOnDemand="true" Width="100%" Height="300" ItemsPerRequest="10"  DataTextField="PROJECT_NAME" DataValueField="PROJECT_ID" >
                </telerik:RadComboBox>
              </EditItemTemplate>
     
    <HeaderStyle Width="15%"></HeaderStyle>
     
    <ItemStyle Width="15%"></ItemStyle>
            </telerik:GridTemplateColumn>    
     
          </Columns>
          <PagerStyle Position="TopAndBottom" AlwaysVisible="True" />
        </MasterTableView>
        <GroupingSettings CollapseAllTooltip="Collapse all groups"></GroupingSettings>
     
        <ExportSettings>
          <Pdf PageWidth="">
          </Pdf>
        </ExportSettings>
     
        <ClientSettings AllowKeyboardNavigation="true" EnableRowHoverStyle="true">
          <Selecting AllowRowSelect="True" />
          <Scrolling AllowScroll="true" UseStaticHeaders="true" />
        </ClientSettings>
     
        <PagerStyle Position="TopAndBottom" AlwaysVisible="True" />
        <FilterMenu RenderMode="Lightweight"></FilterMenu>
     
        <HeaderContextMenu RenderMode="Lightweight"></HeaderContextMenu>
      </telerik:RadGrid>
     
     
    </asp:Content>

    CS:

    using System;
    using System.Data;
    using Telerik.Web.UI;
     
     
    namespace TimeReport.Web.Pages
    {
      public partial class WebForm2 : Api.Page
      {
        private const int ItemsPerRequest = 10;
     
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        protected void PROJECT_ItemsRequested1(object sender, RadComboBoxItemsRequestedEventArgs e)
        {
          DataTable data = new Api.Projects(TRApiSessionContext.CurrentUser.Login).LoadBasic();  //Load DataTable for ComboBox
          int itemOffset = 0;
        int endOffset = 0;
        int count = 0;
          if (data == null)
          {
            e.EndOfItems = true;
          }
          else
          {
            itemOffset = e.NumberOfItems;
            endOffset = Math.Min(itemOffset + ItemsPerRequest, data.Rows.Count);
            e.EndOfItems = endOffset == data.Rows.Count;
            count = data.Rows.Count;
          }
           
          for (int i = itemOffset; i<endOffset; i++)
          {
            ((RadComboBox)sender).Items.Add(new RadComboBoxItem(data.Rows[i]["PROJECT_FULL_NAME"].ToString(), data.Rows[i]["PROJECT_ID"].ToString()));
          }
        //  e.Message = GetStatusMessage(endOffset, count);
        }
     
        protected void messages_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
          RadGrid1.DataSource = new Api.Activities("vrabel").Load();  //Load DataTable for Grid
        }
      }
    }

     

    Thank you.

  2. Attila Antal
    Admin
    Attila Antal avatar
    440 posts

    Posted 21 Oct 2019 Link to this post

    Hi Igor,

    The BatchEditing uses the Text property of the Controls, meaning that the Value behind an item does not count. Here is an example from the Grid - Batch Editing online demo.

    The following Template column with a DropDownList extracts the CategoryName only:

    <telerik:GridTemplateColumn HeaderText="Category" DefaultInsertValue="Beverages" HeaderStyle-Width="150px" UniqueName="CategoryID" DataField="CategoryID">
        <ItemTemplate>
            <%# Eval("CategoryName") %>
        </ItemTemplate>
        <EditItemTemplate>
            <telerik:RadDropDownList RenderMode="Lightweight" runat="server" ID="CategoryIDDropDown" DataValueField="CategoryID"
                DataTextField="CategoryName" DataSourceID="SqlDataSource2">
            </telerik:RadDropDownList>
        </EditItemTemplate>
    </telerik:GridTemplateColumn>

     

    In case you want to insert values instead of text, in the BatchEditCommand event, when changes are posted to the server, access the Text coming from the grid and use this to search by in the database and extract the values (IDs). Once you have the ID, insert/update the ID field in the database instead of the Text.

    protected void RadGrid1_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
    {
        if (e.CommandName == RadGrid.BatchEditCommandName)
        {
            GridBatchEditingEventArgument argument = e.CommandArgument as GridBatchEditingEventArgument;
            Hashtable oldValues = argument.OldValues;
            Hashtable newValues = argument.NewValues;
    
            // query the database to find the ID by name
            string PROJECT_ID = "SELECT [ID] FROM [Table] WHERE PROJECT_NAME = '" + newValues["PROJECT_NAME"] + "'";
        
        // insert PROJECT_ID to database as Grid record instead of PROJECT_NAME
        }
    }

     

     

    Kind regards,
    Attila Antal
    Progress Telerik

    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
  3. Igor
    Igor avatar
    6 posts
    Member since:
    Jun 2019

    Posted 15 Nov 2019 in reply to Attila Antal Link to this post

    Hi, thanks for the reply.

    This is not exactly what I asked, but that is okay now.

    In the case of a Batch command, it is not optimal to search ID by Name.

    I am simply binding ID to tag like this:

     

      <ItemTemplate>
                <label id='GridComboBoxValue' tag='<%#DataBinder.Eval( Container.DataItem, "PROJECT_ID")%>'><%#DataBinder.Eval( Container.DataItem, "PROJECT_NAME")%></label>
              </ItemTemplate>

    Then you can get the ID on postback from a tag.

  4. Attila Antal
    Admin
    Attila Antal avatar
    440 posts

    Posted 18 Nov 2019 Link to this post

    Hi Igor,

    Yes, that is also a good approach. Feel free to use it.

    Kind Regards,
    Attila Antal
    Progress Telerik

    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top