英文:
GridCommandEventArgs items have no data values
问题
我有一个RadGrid,需要在其中添加、更新和删除数据。我已经使功能能够运行,但我还需要在数据被添加/更新之前对其进行一些检查,包括基于其他数据设置字段。我还希望记录所做的操作。
我的插入功能正在运行。RadGrid如下所示:
<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>
<!-- 列定义 -->
</Columns>
</MasterTableView>
</telerik:RadGrid>
在代码后台,我有以下内容:
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
但是在调试时,我发现所有的e.Item.Cells
的Text
属性都是"\&nbsp;"
。然而,添加到数据库的记录中包含我放入字段的数据,这是应该的。
可能是什么缺失?或者多了什么?
英文:
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.
答案1
得分: 1
以下是两种访问单元格数据的选项。
- 使用散列表/字典访问新插入的数据。它仅从EditItems中检索数据,因此不包括只读行。
- 将您的editItem转换为数据项,然后访问当前单元格,您会发现它始终是
&nbsp;
,因为数据尚未放入其中。输入的数据只存在于编辑项中。
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
上述代码应该满足您的需求,不过为了增加一些细节:
Telerik使用&nbsp;
来表示空/Null单元格文本字段,这在这里是有道理的,因为您试图获取的单元格文本不存在。它确实是空的,您正在访问它。然而,您正在访问的字段是只读的,似乎没有默认值。您在其他地方设置了吗?我在下面包含了一个函数,它经常用于检查String.IsNullOrEmpty
和&nbsp;
,以节省一些逻辑。我建议将它放在一个安全的地方,并根据需要使用,因为RadGrid中的空单元格实际上永远不会是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
英文:
Below are two options to access the cell data.
- This accesses the newly inserted data using a hashtable/dictionary. It only retrieves data from EditItems so read-only rows are not included
- 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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论