在 radgrid 中绑定 radcombobox 的首选方法是什么?
What is the preferred way to bind a radcombobox in a radgrid?
我已经看到很多与此相关的问题,但还没有找到我的答案。以下是我的示例的要点:
- RadGrid 有一个 GridTemplateColumn
- GridTemplateColumn 的 EditItemTemplate 中有一个 RadComboBox
- RadComboBox 绑定到一个 ObjectDataSource 并且有一个 RequiredFieldValidator
- SelectedValue='<%#Bind("SomeValue")%>' 似乎有效但会导致验证问题
- 在 ItemDataBound 事件中设置 RadComboBox1.SelectedValue 似乎有效
与 ItemDataBound 中的代码绑定是执行此操作的最佳方式吗?有趣的是,在 aspx 页面上设置 SelectedValue='<%#Bind("SomeValue")%>' 在我获得 ItemDataBound 时已经设置了 SelectedValue 但由于某种原因,RequiredFieldValidator 在编辑模式下失败时除非我在 ItemDataBound 中再次设置值,否则这样做。下面是我的代码的精简版。
<telerik:RadGrid ID="rgTasks" runat="server" AllowAutomaticInserts="false" AllowAutomaticUpdates="false" AutoGenerateColumns="False">
<MasterTableView DataKeyNames="Id">
<CommandItemSettings ShowRefreshButton="False"></CommandItemSettings>
<Columns>
<telerik:GridEditCommandColumn ButtonType="ImageButton" UniqueName="EditCommandColumn"></telerik:GridEditCommandColumn>
<telerik:GridBoundColumn DataField="Id" ReadOnly="True" UniqueName="Id" DataType="System.Int32" Visible="false"></telerik:GridBoundColumn>
<telerik:GridTemplateColumn UniqueName="TaskTypeId" HeaderText="Task" DataField="TaskTypeId" DefaultInsertValue="">
<ItemTemplate>
<%# Eval("TaskType.Name")%>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadComboBox ID="rcbTaskTypeId" runat="server" EmptyMessage="Select TaskType..."
DataSourceID="odsTaskTypes" DataValueField="Id" DataTextField="Name" SelectedValue='<%#Bind("TaskTypeId")%>'>
</telerik:RadComboBox>
<asp:RequiredFieldValidator ID="rfvTaskTypeId" runat="server" ControlToValidate="rcbTaskTypeId" ErrorMessage="Task Type is required" Display="Dynamic"></asp:RequiredFieldValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
<asp:ObjectDataSource ID="odsTaskTypes" runat="server" SelectMethod="GetTaskTypes" TypeName="CAPAModel.CAPARepo.DataRepo"></asp:ObjectDataSource>
Protected Sub rgTasks_ItemDataBound(sender As Object, e As GridItemEventArgs) Handles rgTasks.ItemDataBound
If ((TypeOf e.Item Is GridEditableItem) AndAlso e.Item.IsInEditMode) Then
If Not String.IsNullOrEmpty(DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString) Then
Dim rcbTaskTypeId As RadComboBox = e.Item.FindControl("rcbTaskTypeId")
rcbTaskTypeId.SelectedValue = DataBinder.Eval(e.Item.DataItem, "TaskTypeId")
End If
End If
End Sub
我看到了一些相关问题,但我正在寻找关于我应该如何做以及为什么这样做的解释。谢谢。
发生错误是因为您将两个不同的数据字段设置为 DataValueField 和 SelectedValue。我想您想要显示除 DataValueField 和 DataTextField 中的数据之外的另一个字段。请查看以下代码片段。
ASPX:
<telerik:GridTemplateColumn DataField="test" FilterControlAltText="Filter RegistryValue column" HeaderText="test" SortExpression="test" UniqueName="test">
<EditItemTemplate>
<telerik:RadComboBox ID="RadComboBox1" Runat="server" DataSourceID="odsTaskTypes" DataTextField="Name" DataValueField="Id" >
</telerik:RadComboBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="RegistryValueLabel" runat="server" Text='<%# Eval("RegistryValue") %>'></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
C#:
protected void gridiew1_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item is GridEditableItem && e.Item.IsInEditMode)
{
GridEditableItem editItem = (GridEditableItem)e.Item;
RadComboBox combo = (RadComboBox)editItem.FindControl("RadComboBox1");
combo.SelectedItem.Text = (string)DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString();
}
}
所以我在 Telerik 的支持下来回反复,他们的建议是按照我正在做的方式去做。考虑到我在代码中绑定控件,我可能会像这样摆脱 SelectedValue='<%#Bind("TaskTypeId")%>'
:
<telerik:RadComboBox ID="rcbTaskTypeId" runat="server"
DataSourceID="odsTaskTypes" DataValueField="Id" DataTextField="Name" >
</telerik:RadComboBox>
...然后保持代码不变:
Protected Sub rgTasks_ItemDataBound(sender As Object, e As GridItemEventArgs) Handles rgTasks.ItemDataBound
If ((TypeOf e.Item Is GridEditableItem) AndAlso e.Item.IsInEditMode) Then
If Not String.IsNullOrEmpty(DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString) Then
Dim rcbTaskTypeId As RadComboBox = e.Item.FindControl("rcbTaskTypeId")
rcbTaskTypeId.SelectedValue = DataBinder.Eval(e.Item.DataItem, "TaskTypeId")
End If
End If
End Sub
我已经看到很多与此相关的问题,但还没有找到我的答案。以下是我的示例的要点:
- RadGrid 有一个 GridTemplateColumn
- GridTemplateColumn 的 EditItemTemplate 中有一个 RadComboBox
- RadComboBox 绑定到一个 ObjectDataSource 并且有一个 RequiredFieldValidator
- SelectedValue='<%#Bind("SomeValue")%>' 似乎有效但会导致验证问题
- 在 ItemDataBound 事件中设置 RadComboBox1.SelectedValue 似乎有效
与 ItemDataBound 中的代码绑定是执行此操作的最佳方式吗?有趣的是,在 aspx 页面上设置 SelectedValue='<%#Bind("SomeValue")%>' 在我获得 ItemDataBound 时已经设置了 SelectedValue 但由于某种原因,RequiredFieldValidator 在编辑模式下失败时除非我在 ItemDataBound 中再次设置值,否则这样做。下面是我的代码的精简版。
<telerik:RadGrid ID="rgTasks" runat="server" AllowAutomaticInserts="false" AllowAutomaticUpdates="false" AutoGenerateColumns="False">
<MasterTableView DataKeyNames="Id">
<CommandItemSettings ShowRefreshButton="False"></CommandItemSettings>
<Columns>
<telerik:GridEditCommandColumn ButtonType="ImageButton" UniqueName="EditCommandColumn"></telerik:GridEditCommandColumn>
<telerik:GridBoundColumn DataField="Id" ReadOnly="True" UniqueName="Id" DataType="System.Int32" Visible="false"></telerik:GridBoundColumn>
<telerik:GridTemplateColumn UniqueName="TaskTypeId" HeaderText="Task" DataField="TaskTypeId" DefaultInsertValue="">
<ItemTemplate>
<%# Eval("TaskType.Name")%>
</ItemTemplate>
<EditItemTemplate>
<telerik:RadComboBox ID="rcbTaskTypeId" runat="server" EmptyMessage="Select TaskType..."
DataSourceID="odsTaskTypes" DataValueField="Id" DataTextField="Name" SelectedValue='<%#Bind("TaskTypeId")%>'>
</telerik:RadComboBox>
<asp:RequiredFieldValidator ID="rfvTaskTypeId" runat="server" ControlToValidate="rcbTaskTypeId" ErrorMessage="Task Type is required" Display="Dynamic"></asp:RequiredFieldValidator>
</EditItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
<asp:ObjectDataSource ID="odsTaskTypes" runat="server" SelectMethod="GetTaskTypes" TypeName="CAPAModel.CAPARepo.DataRepo"></asp:ObjectDataSource>
Protected Sub rgTasks_ItemDataBound(sender As Object, e As GridItemEventArgs) Handles rgTasks.ItemDataBound
If ((TypeOf e.Item Is GridEditableItem) AndAlso e.Item.IsInEditMode) Then
If Not String.IsNullOrEmpty(DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString) Then
Dim rcbTaskTypeId As RadComboBox = e.Item.FindControl("rcbTaskTypeId")
rcbTaskTypeId.SelectedValue = DataBinder.Eval(e.Item.DataItem, "TaskTypeId")
End If
End If
End Sub
我看到了一些相关问题,但我正在寻找关于我应该如何做以及为什么这样做的解释。谢谢。
发生错误是因为您将两个不同的数据字段设置为 DataValueField 和 SelectedValue。我想您想要显示除 DataValueField 和 DataTextField 中的数据之外的另一个字段。请查看以下代码片段。
ASPX:
<telerik:GridTemplateColumn DataField="test" FilterControlAltText="Filter RegistryValue column" HeaderText="test" SortExpression="test" UniqueName="test">
<EditItemTemplate>
<telerik:RadComboBox ID="RadComboBox1" Runat="server" DataSourceID="odsTaskTypes" DataTextField="Name" DataValueField="Id" >
</telerik:RadComboBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="RegistryValueLabel" runat="server" Text='<%# Eval("RegistryValue") %>'></asp:Label>
</ItemTemplate>
</telerik:GridTemplateColumn>
C#:
protected void gridiew1_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item is GridEditableItem && e.Item.IsInEditMode)
{
GridEditableItem editItem = (GridEditableItem)e.Item;
RadComboBox combo = (RadComboBox)editItem.FindControl("RadComboBox1");
combo.SelectedItem.Text = (string)DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString();
}
}
所以我在 Telerik 的支持下来回反复,他们的建议是按照我正在做的方式去做。考虑到我在代码中绑定控件,我可能会像这样摆脱 SelectedValue='<%#Bind("TaskTypeId")%>'
:
<telerik:RadComboBox ID="rcbTaskTypeId" runat="server"
DataSourceID="odsTaskTypes" DataValueField="Id" DataTextField="Name" >
</telerik:RadComboBox>
...然后保持代码不变:
Protected Sub rgTasks_ItemDataBound(sender As Object, e As GridItemEventArgs) Handles rgTasks.ItemDataBound
If ((TypeOf e.Item Is GridEditableItem) AndAlso e.Item.IsInEditMode) Then
If Not String.IsNullOrEmpty(DataBinder.Eval(e.Item.DataItem, "TaskTypeId").ToString) Then
Dim rcbTaskTypeId As RadComboBox = e.Item.FindControl("rcbTaskTypeId")
rcbTaskTypeId.SelectedValue = DataBinder.Eval(e.Item.DataItem, "TaskTypeId")
End If
End If
End Sub