【问题标题】:What is the preferred way to bind a radcombobox in a radgrid?在 radgrid 中绑定 radcombobox 的首选方法是什么?
【发布时间】:2015-01-06 21:40:40
【问题描述】:

我已经看到了很多与此相关的问题,但还没有找到我的答案。以下是我的示例的要点:

  • RadGrid 有一个 GridTemplateColumn
  • GridTemplateColumn 的 EditItemTemplate 中有一个 RadComboBox
  • RadComboBox 绑定到一个 ObjectDataSource 并且有一个RequiredFieldValidator
  • SelectedValue='' 似乎有效,但会导致验证问题
  • 在 ItemDataBound 事件中设置 RadComboBox1.SelectedValue 似乎有效

与 ItemDataBound 中的代码绑定是最好的方法吗?有趣的是,在 aspx 页面上设置 SelectedValue='' 在我获得 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

我看到了一些相关的问题,但我正在寻找关于我应该如何做以及为什么这样做的解释。谢谢。

【问题讨论】:

    标签: asp.net telerik radgrid radcombobox


    【解决方案1】:

    发生错误是因为您将两个不同的数据字段设置为 DataValueField 和 SelectedValue。我想你想显示另一个字段,而不是 DataValueField 和 DataTextField 中的数据。请查看以下代码 sn-p。

    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();      
        }      
    }
    

    【讨论】:

    • 感谢您的回复,Saritha。我应该更清楚并编辑我的问题。上面的代码运行良好。但是,如果我不重置 ItemDataBound 中的 RadComboBox1.SelectedValue,除非我更改 RadComboBox 中的值,否则RequiredFieldValidator 将错误地触发。奇怪的是,当我重置 SelectedValue 时,它​​实际上已经存在了。
    【解决方案2】:

    因此,我在 Telerik 的支持下反复讨论了这一点,他们的建议是按照我的方式来做。考虑到我在代码中绑定了控件,我大概可以像这样摆脱SelectedValue='&lt;%#Bind("TaskTypeId")%&gt;'

    <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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      相关资源
      最近更新 更多