【问题标题】:How do I set the MinValue of a RadNumericTextBox to the value being edited如何将 RadNumericTextBox 的 MinValue 设置为正在编辑的值
【发布时间】:2014-09-30 16:15:01
【问题描述】:

我在 RadGrid 内的 GridTemplateColumn 中有一个 RadnumericTextBox,我希望能够在用户更改之前将 MinValue 属性设置为正在编辑的初始值。这个想法是用户可以继续增加该值,但一旦保存就不能减少它。

我一直在尝试提出一些服务器端解决方案,但据我所知,网格模板列不是网格渲染的一部分。

<telerik:RadGrid ID="StudentGrid" AutoGenerateColumns="false" AllowFilteringByColumn="True" AllowSorting="True" AllowPaging="True"
            OnNeedDataSource="StudentGrid_OnNeedDataSource"
            runat="server">
    <telerik:GridTemplateColumn AllowFiltering="False" HeaderStyle-Width="25px" DataField="Sunday"
          HeaderText="Sunday" UniqueName="SundayColumn">
       <EditItemTemplate>
          <telerik:RadNumericTextBox ID="editTextBox" Type="Number" MinValue="0" MaxValue="9"
                DisplayText='<%# Bind("Sunday") %>' AllowOutOfRangeAutoCorrect="true" runat="server">
             <NumberFormat GroupSeparator="" DecimalDigits="0"></NumberFormat>
          </telerik:RadNumericTextBox>
       </EditItemTemplate>
       <ItemTemplate>
          <%# DataBinder.Eval(Container.DataItem, "Sunday") %>
       </ItemTemplate>
    </telerik:GridTemplateColumn>
</telerik:RadGrid>

更新:事实证明,一个网格模板在页面上呈现一次,并重新用于该列中的每个单元格。它被重新定位并具体化在正在编辑的任何单元格的顶部。由于它没有绑定到任何特定的单元格,因此在呈现页面之前没有关于正在编辑的单元格的信息与其关联。请参阅下文了解我的客户端解决方案。

【问题讨论】:

标签: asp.net .net grid telerik edit


【解决方案1】:

解决方案是拦截客户端 OnCellSelecting 网格事件以及 OnFocus/OnBlur Ra​​dNumerictextBox 事件。

<telerik:RadGrid ID="StudentGrid" AutoGenerateColumns="false" AllowFilteringByColumn="True" AllowSorting="True" AllowPaging="True"
    OnNeedDataSource="StudentGrid_OnNeedDataSource"
    runat="server">
    <ClientSettings>
        <Selecting CellSelectionMode="SingleCell"></Selecting>
        <ClientEvents OnCellSelecting="StudentGrid_OnCellSelecting"/>
    </ClientSettings>
    <telerik:GridTemplateColumn AllowFiltering="False" HeaderStyle-Width="25px" DataField="Sunday"
          HeaderText="Sunday" UniqueName="SundayColumn">
       <EditItemTemplate>
          <telerik:RadNumericTextBox ID="editTextBox" Type="Number" MinValue="0" MaxValue="9"
                DisplayText='<%# Bind("Sunday") %>' AllowOutOfRangeAutoCorrect="true" runat="server">
             <NumberFormat GroupSeparator="" DecimalDigits="0"></NumberFormat>
             <ClientEvents OnFocus="onEditTextBoxFocus" OnBlur="onEditTextBoxBlur"></ClientEvents>
          </telerik:RadNumericTextBox>
       </EditItemTemplate>
       <ItemTemplate>
          <%# DataBinder.Eval(Container.DataItem, "Sunday") %>
       </ItemTemplate>
    </telerik:GridTemplateColumn>
</telerik:RadGrid>

然后添加这些 javascript 事件处理程序。

<script type="text/javascript">
    function onEditTextBoxFocus(sender, eventArgs)
    {
        // sender is the RadNumericTextBox and does not contain any information
        // about the grid row so we have to look at it's parent to get the
        // grid row cells
        var cells = sender.get_parent().get_element().cells;
        // Switch from Telerik to jQuery to locate selected cell and get it's initial value
        var selectedCell = $(cells).filter('.rgSelectedCell');
        var initialValue = selectedCell.attr("InitialValue");
        sender.set_minValue(initialValue);
    }

    function onEditTextBoxBlur(sender, eventArgs)
    {
        // Have to reset this value because it's interfering with
        //validation on next cell being edited
        sender.set_minValue(0);
    }

    function StudentGrid_OnCellSelecting(sender, eventArgs)
    {
        // Get the grid cell being selected
        var columnName = eventArgs.get_column().get_uniqueName();
        var data = eventArgs.get_gridDataItem();
        var cell = data.get_cell(columnName);
        var initialValue = cell.getAttribute("InitialValue");
        // Set inital value if it doesn't already exist
        if (initialValue == null)
        {
            var cellValue = cell.innerText.charAt(0);
            if (cellValue == '') cellValue = 0;
            // Set an InitialValue attribute in the cell about to be edited
            // This will be picked up by the RadNumericTextBox when it gets focus (see above)
            cell.setAttribute("InitialValue", cellValue);
        }
    }
</script>

OnCellSelecting 事件处理程序(首先)在单元格选择上触发,并在编辑开始之前捕获单元格的初始值,并将其存储在网格单元格的 InitialValue 属性中。这是必需的,因为相同的 RadNumericTextBox 用于编辑使用网格模板的每个单元格。

稍后当 RadNumerictextBox 获得焦点时,将从网格单元属性中检索初始值并将其应用于 RadNumerictextBox 的 MinValue。当 RadNumericTextBox 失去焦点时,MinValue 需要重置为 0,因为它似乎会延续到下一个编辑单元格的验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2011-02-23
    • 2021-01-31
    • 2019-06-30
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多