Определение того, какой элемент управления запускает событие в просмотре списка
Я спрашивал об этом на форумах telerik, но иногда ответы там могут быть медленными. Мне было интересно, если кто-нибудь здесь знает, как это сделать.
Я нахожусь в ситуации, когда у пользователя будет переменное количество элементов, а рядом с каждым элементом я хочу RadNumericTextBox. Я думал об использовании RadListView и установке в качестве шаблона имени элемента и связанного с ним RadNumericTextBox. Я хочу игнорировать редактирование, создание и более продвинутые функции RadListView. Я просто хочу список элементов с полями ввода, которые будут автоматически отправлять обратно, когда пользователь изменил значение.
Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь меняет число в текстовом поле, как узнать, что это за текстовое поле? Я искал, есть ли в RadNumericTextBox атрибут, который может содержать произвольное значение, такое как мой ключ элемента, чтобы я знал, какое число они изменили. Однако я не вижу такого атрибута.
Есть ли какой-нибудь способ определить, какое текстовое поле они редактировали, когда я автоматически отправляю ответ?
Если кто-то спросит, я не хочу заставлять моего пользователя нажимать кнопку, чтобы перевести строку в режим редактирования, изменить номер, а затем нажать кнопку, чтобы сохранить строку.
2 ответа
Вы могли бы сделать это с Repeater
контроль.
Включить RadNumericTextBox
в шаблоне элемента повторителя, а затем напишите для него обработчик событий на стороне сервера. Идентификатор клиента текстового поля можно получить через обработчик события 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
То, что вы можете сделать, - это элемент, который связывает представление списка с источником данных, чтобы идентификатор RadNumericTextBox равнялся ключу вашего элемента, который вы хотите передать. В событии 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
}
Надеюсь, это полезно.