Search code examples
vb.nettelerikradgrid

GridCommandEventArgs items have no data values


I have a RadGrid with which I need to add, update, and delete data. I've gotten the functionality to work, but I also need to do some checking on the data before it gets added/updated, including setting a field based on other data. I also want to log what was done.

My Insert functionality is working. The RadGrid is as follows:

            <telerik:RadGrid ID="CarrierRadGrid" runat="server" AllowFilteringByColumn="True" AllowPaging="False" Width="100%" Height="800px" PageSize="20" da
                AllowSorting="True" DataSourceID="CarrierData" ShowStatusBar="True"
                OnInsertCommand="CarrierRadGrid_InsertCommand" OnItemInserted="CarrierRadGrid_ItemInserted" AllowAutomaticInserts="true"
                OnUpdateCommand="CarrierRadGrid_UpdateCommand" OnItemUpdated="CarrierRadGrid_ItemUpdated" AllowAutomaticUpdates="true"
                OnDeleteCommand="CarrierRadGrid_DeleteCommand" OnItemDeleted="CarrierRadGrid_ItemDeleted" AllowAutomaticDeletes="true"
                Skin="Telerik" AutoGenerateColumns="False" AutoGenerateEditColumn="false" AutoGenerateDeleteColumn="false">
                <ClientSettings EnableRowHoverStyle="true" EnablePostBackOnRowClick="false">
                    <Scrolling AllowScroll="true" UseStaticHeaders="true" SaveScrollPosition="true" FrozenColumnsCount="5" />
                    <Selecting AllowRowSelect="true" />
                    <Resizing AllowColumnResize="true" AllowResizeToFit="true" />
                    <ClientEvents OnRowDeleting="void 0" />
                </ClientSettings>
                <GroupingSettings CaseSensitive="false" />
                <ExportSettings HideStructureColumns="true">
                </ExportSettings>
                <HeaderContextMenu EnableAutoScroll="False">
                </HeaderContextMenu>
                <MasterTableView DataKeyNames="CarrierScacID" DataSourceID="CarrierData" AllowAutomaticInserts="true" AllowAutomaticDeletes="True" AllowAutomaticUpdates="true"
                    CommandItemDisplay="Top" HierarchyLoadMode="ServerOnDemand" EditMode="InPlace">
                    <CommandItemSettings
                        ShowExportToWordButton="false"
                        ShowExportToCsvButton="false"
                        ShowExportToPdfButton="false"
                        ShowAddNewRecordButton="true">
                    </CommandItemSettings>
                    <Columns>
                        <telerik:GridEditCommandColumn ButtonType="ImageButton" CancelText="Cancel" EditText="Edit" InsertText="Add"
                            UpdateText="Update" HeaderStyle-Width="30px" UniqueName="CarrierEditButton" />
                        <telerik:GridClientDeleteColumn ButtonType="ImageButton" Text="Delete" HeaderStyle-Width="30px" UniqueName="CarrierDeleteButton"
                            ConfirmTextFields="CarrierScac" ConfirmTextFormatString="Are you sure you want to delete carrier {0}?" CommandName="Delete" />
                        <telerik:GridBoundColumn DataField="CarrierScacID" HeaderText="CarrierScacID" UniqueName="CarrierScacID" ReadOnly="True" Display="false" />
                        <telerik:GridTemplateColumn>
                            <EditItemTemplate>
                                <telerik:RadLabel runat="server" ID="CarrierScac" Text='<% #Bind("CarrierScac") %>' ViewStateMode="Disabled" Enabled="false" />
                            </EditItemTemplate>
                            <InsertItemTemplate>
                                <telerik:RadTextBox ID="CarrierScac" runat="server" Text='<% #Bind("CarrierScac") %>' />
                            </InsertItemTemplate>
                            <ItemTemplate>
                                <telerik:RadLabel runat="server" ID="CarrierScac" Text='<% #Bind("CarrierScac") %>' />
                            </ItemTemplate>
                        </telerik:GridTemplateColumn>
                        <telerik:GridBoundColumn DataField="CarrierScac" HeaderText="SCAC" UniqueName="CarrierScac" FilterControlWidth="40px" HeaderStyle-Width="75px" />
                        <telerik:GridBoundColumn DataField="CarrierName" HeaderText="Carrier Name" UniqueName="CarrierName" ItemStyle-Wrap="false"
                            HeaderStyle-Width="200px" FilterControlWidth="160px" FilterControlAltText="Filter by Carrier Name" SortExpression="CarrierName" />
                        <telerik:GridBoundColumn DataField="Address" HeaderText="Address" UniqueName="Address" ItemStyle-Wrap="false"
                            HeaderStyle-Width="200px" FilterControlWidth="160px" FilterControlAltText="Filter by Address" SortExpression="Address" />
                        <telerik:GridBoundColumn DataField="City" HeaderText="City" UniqueName="City" HeaderStyle-Width="100px" />
                        <telerik:GridBoundColumn DataField="State" HeaderText="State" UniqueName="State" FilterControlWidth="30px" HeaderStyle-Width="65px" />
                        <telerik:GridBoundColumn DataField="ZIP" HeaderText="ZIP" UniqueName="ZIP" FilterControlWidth="55px" HeaderStyle-Width="90px" />
                        <telerik:GridBoundColumn DataField="Country" HeaderText="Country" UniqueName="Country" FilterControlWidth="55px" HeaderStyle-Width="90px" />
                        <telerik:GridBoundColumn DataField="Contact" HeaderText="Contact" UniqueName="Contact" ItemStyle-Wrap="false" HeaderStyle-Width="110px" />
                        <telerik:GridBoundColumn DataField="Phone" HeaderText="Phone" UniqueName="Phone" ItemStyle-Wrap="false" HeaderStyle-Width="115px" />
                        <telerik:GridBoundColumn DataField="Fax" HeaderText="Fax" UniqueName="Fax" ItemStyle-Wrap="false" HeaderStyle-Width="115px" />
                        <telerik:GridBoundColumn DataField="User" HeaderText="User" UniqueName="User" HeaderStyle-Width="120px" ReadOnly="true" />
                        <telerik:GridBoundColumn DataField="Update" HeaderText="Update" UniqueName="Update" ItemStyle-Wrap="false" HeaderStyle-Width="230px" ReadOnly="true" />
                        <telerik:GridBoundColumn DataField="Comments" HeaderText="Comments" UniqueName="Comments" ItemStyle-Wrap="false" HeaderStyle-Width="230px" ReadOnly="true" />
                    </Columns>
                </MasterTableView>
            </telerik:RadGrid>

In code-behind, I have the following:

    Protected Sub CarrierRadGrid_InsertCommand(sender As Object, e As GridCommandEventArgs)
        e = SetCommentsField(e)
    End Sub

    Protected Sub CarrierRadGrid_ItemInserted(sender As Object, e As GridInsertedEventArgs)
        Dim msg As String = String.Format("New carrier (Carrier Code: {0}) added to the database.", e.Item.Cells(6).Text)
        Log(msg)
        MessageBox(msg)
    End Sub

    Private Shared Function SetCommentsField(e As GridCommandEventArgs) As GridCommandEventArgs
        If String.IsNullOrEmpty(e.Item.Cells(18).Text) Then
            Dim update As String = e.Item.Cells(17).Text
            If Not String.IsNullOrEmpty(update) Then
                e.Item.Cells(18).Text = String.Format("Modified by {0}", update)
            End If
        End If
        Return e
    End Function

But when debugging, I find all of the e.Item.Cells Text properties are "&nbsp;". Yet the record added to the database has the data I put into the fields, as it should.

What could be missing? Or extra?

EDIT: Including the whole RadGrid, instead of only the part I thought was relevant.


Solution

  • Below are two options to access the cell data.

    1. This accesses the newly inserted data using a hashtable/dictionary. It only retrieves data from EditItems so read-only rows are not included
    2. This converts your editItem to a data item and accesses the current cell which you will find is consistently &nbsp; because the data has not been put there yet. THe data entered only exists in the edit items.
        Protected Sub CarrierRadGrid_InsertCommand(sender As Object, e As GridCommandEventArgs)
            '1
            Dim insertValues As New Hashtable()
            CType(e.Item, GridEditableItem).ExtractValues(insertValues)
            Dim dd = insertValues("CarrierScac")
            
            '2
            Dim item As GridDataItem = CType(e.Item, GridDataItem)
            Dim itemD = item("CarrierScac").Text
            e = SetCommentsField(e)
        End Sub
    

    The above should get you what you need I suspect, however to add some color

    Telerik uses &nbsp; to denote an empty/null cell text field which makes sense here because the cell text you are trying to grab does not exist. It IS empty and you ARE accessing it. The fields you are accessing, however, are read only and there does not appear to be a default value. Are you setting that elsewhere? I've included a function below that checks for String.IsNullOrEmpty and &nbsp; that we use frequently to spare some logic. I'd put it in a safe place and consume it as needed because empty cells in a radgrid will never actually be string.empty.

        Public Function RadGridCellIsNullOrEmpty(value As String) As Boolean
            value = value.Trim()
            Return (String.IsNullOrEmpty(value) OrElse String.IsNullOrWhiteSpace(value) OrElse value.Contains("&nbsp;"))
        End Function
    
        Private Shared Function SetCommentsField(byRef e As GridCommandEventArgs) As GridCommandEventArgs
    
            If RadGridCellIsNullOrEmpty(e.Item.Cells(18).Text) Then
                Dim update As String = e.Item.Cells(17).Text
                If Not RadGridCellIsNullOrEmpty(update) Then
                    e.Item.Cells(18).Text = String.Format("Modified by {0}", update)
                End If
            End If
            Return e
        End Function