【问题标题】:Determining which control fires an event in a listview确定哪个控件在列表视图中触发事件
【发布时间】:2012-12-24 04:37:18
【问题描述】:

我在 Telerik 论坛上问过这个问题,但有时那里的回复可能很慢。我想知道这里是否有人知道该怎么做。

我的情况是,用户将拥有可变数量的项目,并且在每个项目旁边我想要一个 RadNumericTextBox。我正在考虑使用 RadListView 并将模板设置为项目名称和与之关联的 RadNumericTextBox。我想忽略 RadListView 的编辑、创建和更高级的功能。我只想要一个带有输入框的项目列表,当用户更改值时会自动回发。

我面临的问题是当用户更改文本框中的数字时,我怎么知道这是哪个文本框?我想看看 RadNumericTextBox 上是否有一个属性可以保存任意值,例如我的项目键,这样我就知道它们更改了哪个数字。但是,我没有看到这样的属性。

当我自动回发时,我有什么方法可以确定他们编辑了哪个文本框?

如果有人问,我不想强​​迫我的用户单击一个按钮使该行进入编辑模式,更改数字,然后单击一个按钮来保存该行。

【问题讨论】:

    标签: asp.net .net telerik telerik-ajax


    【解决方案1】:

    您可以使用Repeater 控件来做到这一点。

    在转发器的项目模板中包含RadNumericTextBox,然后为其编写服务器端事件处理程序。文本框的客户端 ID 可以通过事件处理程序的 sender 对象访问,但如果信息不足,您可以依赖转发器的数据源将您需要的任何数据与每个文本框关联起来。

    最简单的方法可能是使用文本框的Label 属性。这是一个例子:

    ASPX:

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:Repeater ID="Repeater1" runat="server">    
        <ItemTemplate>
            <br />
            <telerik:RadNumericTextBox ID="radNTB" runat="server" AutoPostBack="true" OnTextChanged="radNTB_TextChanged" ClientIDMode="Predictable"></telerik:RadNumericTextBox>
        </ItemTemplate>
    </asp:Repeater>
    

    VB:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
    
            Dim dt As New DataTable
            dt.Columns.Add("Column1", GetType(String))
    
            For i As Integer = 1 To 5
                Dim row = dt.NewRow
                row.Item("Column1") = "TextBox" & i.ToString
                dt.Rows.Add(row)
                dt.AcceptChanges()
            Next
    
            Repeater1.DataSource = dt
            Repeater1.DataBind()
    
        End If
    End Sub
    
    Private Sub Repeater1_ItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
        If (e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem) Then
    
            Dim tb As RadNumericTextBox = e.Item.FindControl("radNTB")
            tb.Label = DataBinder.Eval(e.Item.DataItem, "Column1").ToString()
    
        End If
    End Sub
    
    Public Sub radNTB_TextChanged(sender As Object, e As EventArgs)
        Dim ntb As RadNumericTextBox = sender
        Response.Write(ntb.Label)
    End Sub
    

    【讨论】:

      【解决方案2】:

      您可以做的是通过将列表视图与数据源绑定的项目, 使 RadNumericTextBox 的 id 等于您要传递的项目键。 在 RadNumericTextBox TextChanged 事件中,将发送者对象转换为 RadNumericTextBox 类型。在这 如果您将获得您正在寻找的唯一项目密钥。 示例:

      <asp:FormView ID="frmViewPicture" runat="server">
        <EditItemTemplate>
          <telerik:RadNumericTextBox ID='Eval("ItemKey")' 
                OnTextChanged="radTxtNewPrice_TextChanged" AutoPostBack="true">
          </telerik:RadNumericTextBox>                                   
         </EditItemTemplate>
      </asp:FormView>
      

      确保项目键是唯一的并且在您的数据源中可用,否则您将获得异常。

      protected void radTxtNewPrice_TextChanged(object sender, EventArgs e)
      {
         Telerik.Web.UI.RadNumericTextBox txtRadNumericTextBox= (Telerik.Web.UI.RadNumericTextBox)sender;
         var itemKey = txtRadNumericTextBox.ID;
         // Do Your Logic Here 
      
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-08
        • 2010-10-16
        • 2016-05-03
        • 2014-02-23
        • 1970-01-01
        • 2011-09-15
        • 2016-08-26
        • 2023-03-06
        相关资源
        最近更新 更多