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

MasterTable.getCellByColumnUniqueName always returns null

6 Answers 149 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Preeti
Top achievements
Rank 1
Preeti asked on 17 Sep 2013, 06:07 AM
Hi,
I am using RadGrid which has 4 columns. column2 = GridTemplateColumn with ItemTemplate as textbox and column4 = GridTemplateColumn with ItemTemplate as checkbox.

I need to get the value of the textbox and do some calculation and assign the calculated value to column3 for that row.
I am trying to do it on client side and this is my .ascx code for onblur of the textbox :
function ConvertToUSD(index) {               
               var grid = $find("<%=AntiXss.JavaScriptEncode(rgdPOTypes.ClientID).Trim('\'')%>");
               var MasterTable = grid.get_masterTableView();
               var Row = MasterTable.get_dataItems()[index];                                
               var cell = MasterTable.getCellByColumnUniqueName(Row, "TextboxCurreny");              
               if (!cell) {
                       var nextcell = MasterTable.getCellByColumnUniqueName(Row, "InUSD");              
                       nextcell .InnerHTML = cell.InnerHTML * 50;
               }
           }

In the above code, the value of 'cell' is always coming as null.
file.ascx.cs
protected void rgdPOTypes_ItemCreated(object sender, GridItemEventArgs e)
        {
            if (e.Item is GridDataItem)
            {
                GridDataItem item = (GridDataItem)e.Item;
                TextBox txtBox = (TextBox)item.FindControl("TextboxCurreny");
 
                txtBox.Attributes.Add("onblur", "ConvertToUSD('" + item.ItemIndex + "')");
             }
        }

Please help me understand what is going wrong in the code.

Thanks,
Preeti

6 Answers, 1 is accepted

Sort by
0
Princy
Top achievements
Rank 1
answered on 18 Sep 2013, 10:26 AM
Hi Preeti,

Please try the below code snippet .

ASPX:
<telerik:GridTemplateColumn DataField="EmployeeID">
    <ItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("EmployeeID")%>'></asp:TextBox>
   </ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridBoundColumn DataField="ShipVia" HeaderText="ShipVia" UniqueName="ShipVia" />

C#:
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
   {
       if (e.Item is GridDataItem)
       {
           GridDataItem item = (GridDataItem)e.Item;
           TextBox txtBox = (TextBox)item.FindControl("TextBox1");
           txtBox.Attributes.Add("onblur", "ConvertToUSD('" + item.ItemIndex + "')");
       }
   }

JS:
<script type="text/javascript">
    function ConvertToUSD(index) {      
        var grid = $find("<%=RadGrid1.ClientID %>");
        var MasterTable = grid.get_masterTableView();
        var Row = MasterTable.get_dataItems()[index];
        var cell = Row.findElement("TextBox1"); //Access the Template TextBox
        var value = cell.value;
        var nextcell = MasterTable.getCellByColumnUniqueName(Row, "ShipVia"); //Access the bound column
        nextcell.innerText = value * 50; //Set text for the Bound Column     
    }  
</script>

Thanks,
Princy
0
Preeti
Top achievements
Rank 1
answered on 19 Sep 2013, 02:36 PM
Thanks Princy.

But I am getting error for var cell = Row.findElement("TextBox1");
findElement does not exist. :(

FYI, I have changed the textbox to RadNumericTextbox. and accordingly changed the code in .cs file while adding attribute (casting with RadNumericTextbox).
Can this be causing the problem?

Please suggest.
Thanks.
0
Princy
Top achievements
Rank 1
answered on 20 Sep 2013, 03:39 AM
Hi Preeti,

The error you are facing is caused when you have changed the textbox to RadNumericTextbox.Please modify the code as shown below.I have marked places that are edited in JS.

ASPX:
<telerik:RadNumericTextBox ID="RadNumTextBox1" runat="server" Text='<%# Eval("EmployeeID")%>'></telerik:RadNumericTextBox>

C#:
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
   {
       if (e.Item is GridDataItem)
       {
           GridDataItem item = (GridDataItem)e.Item;
           RadNumericTextBox txtBox = (RadNumericTextBox)item.FindControl("RadNumTextBox1");
           txtBox.Attributes.Add("onblur", "ConvertToUSD('" + item.ItemIndex + "')");
       }
   }

JS:
<script type="text/javascript">
    function ConvertToUSD(index) {    
        var grid = $find("<%=RadGrid1.ClientID %>");
        var MasterTable = grid.get_masterTableView();
        var Row = MasterTable.get_dataItems()[index];
        var cell = Row.findControl("RadNumTextBox1"); //Edited
        var value = cell._value; //Edited
        var nextcell = MasterTable.getCellByColumnUniqueName(Row, "ShipVia"); 
        nextcell.innerText = value * 50;    
    }  
</script>

Thanks,
Princy
0
Preeti
Top achievements
Rank 1
answered on 20 Sep 2013, 05:10 AM
Hi Princy,

Thanks a lot for that edited code. There is a minor change though. The value should be accessed as below.
But unfortunately I am still getting null for nextcell. Why is the 'getCellByColumnUniqueName returning null? Is the parameter being passed incorrectly ? Another piece of info: I am doing this in the .ascx file.  Hope that is not an issue.
function ConvertToUSD(index) {
               var grid = $find("<%=AntiXss.JavaScriptEncode(rgdGrid.ClientID).Trim('\'') %>");
               var MasterTable = grid.get_masterTableView();
               var Row = MasterTable.get_dataItems()[index];
               var cell = Row.findControl("txtRadNum");
               var value = cell._element.value; //Edited              
               var nextcell = MasterTable.getCellByColumnUniqueName(Row, "InUSD"); //Access the bound column
               nextcell.innerText = str; //Set text for the Bound Column
               alert(nextcell.innerText);
 
           }


I am attaching below the grid properties also:
<telerik:RadGrid ID="rgdGrid" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False"
                    enableajax="False" Skin="WebBlue" skinspath="~/Skins/RadGrid" OnNeedDataSource="rgdGrid_NeedDataSource" OnItemCreated="rgdGrid_ItemCreated"
                     OnItemDataBound="rgdGrid_ItemDataBound" OnPageSizeChanged="rgdGrid_PageSizeChanged" AllowMultiRowSelection="true">                               
                    <MasterTableView DataKeyNames="SubClass,ApprovalLimit,InUSD,IsManaged" ShowHeadersWhenNoRecords="true" TableLayout="Fixed"
                        CssClass="wrapword" Width="100%">
                        <PagerStyle Mode="NextPrevNumericAndAdvanced" AlwaysVisible="true" />
                        <HeaderStyle Width="20px" Font-Bold="true" HorizontalAlign="Left" />
                        <ItemStyle HorizontalAlign="Left" />
                        <RowIndicatorColumn Visible="False">                           
                        </RowIndicatorColumn>
                        <ExpandCollapseColumn Resizable="False" Visible="False">                       
                        </ExpandCollapseColumn>
                        <Columns>     
                            <telerik:GridBoundColumn DataField="SubClass" HeaderText="SubClass" SortExpression="SubClass"
                                            UniqueName="SubClass" ItemStyle-Width="25%" ItemStyle-Wrap="true">
 
                                        </telerik:GridBoundColumn>
                                        <telerik:GridTemplateColumn DataField="ApprovalLimit" AllowFiltering="False" ItemStyle-Wrap="true" HeaderText="Approval Limit" UniqueName="ApprovalLimit" ItemStyle-Width="20%">
                                             
                                            <ItemTemplate>
                                                <telerik:RadNumericTextBox ID="txtRadNum" AutoPostBack="true" runat="server" Skin="Office2007" OnTextChanged="txtRadNum_TextChanged"
                                                    Columns="20" MinValue="0" onkeyup="javascript:RemoveInvalidChars(this);" Text='<%# (AntiXss.HtmlEncode(DataBinder.Eval(Container.DataItem, "ApprovalLimit").ToString())) %>' />
                                        </ItemTemplate>
                            </telerik:GridTemplateColumn>
                                        <telerik:GridBoundColumn DataField="InUSD" ReadOnly="true" HeaderText="In USD" UniqueName="InUSD" ItemStyle-Width="15%" ItemStyle-Wrap="true" HeaderStyle-HorizontalAlign="left">
<HeaderStyle HorizontalAlign="Left"></HeaderStyle>
 
<ItemStyle Wrap="True" Width="25%"></ItemStyle>
                                        </telerik:GridBoundColumn>                                                 
                            <telerik:GridTemplateColumn DataField="IsManaged" AllowFiltering="False" UniqueName="IsManaged" HeaderText="Is Managed">                                       
                                        <HeaderStyle Width="20px" HorizontalAlign="Left" />
                                        <ItemStyle Width="20%" />
                                        <ItemTemplate>
                                            <asp:CheckBox ID="chkManaged" runat="server" Enabled= '<%# ((AntiXss.HtmlEncode(DataBinder.Eval(Container.DataItem, "ReqClassSubClass").ToString()).Contains("GEN")) ||
                                            (AntiXss.HtmlEncode(DataBinder.Eval(Container.DataItem, "ReqClassSubClass").ToString()).Contains("CONT")) ||
                                            (AntiXss.HtmlEncode(DataBinder.Eval(Container.DataItem, "ReqClassSubClass").ToString()).Contains("STDMKT"))) %>'
                                                Checked='<%# (AntiXss.HtmlEncode(DataBinder.Eval(Container.DataItem, "IsManaged").ToString())).ToLower() == "true"? true:false%>' />
                                        </ItemTemplate>
                                    </telerik:GridTemplateColumn>                         
                        </Columns>
                    </MasterTableView>
                    <ClientSettings>
                        <Resizing AllowColumnResize="false" AllowRowResize="false" ClipCellContentOnResize="true" />
                    </ClientSettings>
 
<FilterMenu Skin="WebBlue" EnableTheming="True">
<CollapseAnimation Type="OutQuint" Duration="200"></CollapseAnimation>
</FilterMenu>
                </telerik:RadGrid>

Thanks
0
Preeti
Top achievements
Rank 1
answered on 20 Sep 2013, 08:33 AM
Got it!

I was setting the GridBounDColumn visible false and that is why getting null. :)

Thanks!!
0
Maria Ilieva
Telerik team
answered on 24 Sep 2013, 10:38 AM
Hi Preeti,

See the forum post below for more information on this matter:
http://www.telerik.com/community/forums/aspnet-ajax/grid/breaking-change-hidden-column-cell-text-is-not-persisted-in-viewstate.aspx

Regards,
Maria Ilieva
Telerik
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to the blog feed now.
Tags
Grid
Asked by
Preeti
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 1
Preeti
Top achievements
Rank 1
Maria Ilieva
Telerik team
Share this question
or