Включить PostBack для пользовательского элемента управления ASP.NET - PullRequest
1 голос
/ 30 апреля 2010

Когда я нажимаю кнопку «Запрос», мое текстовое поле TestID TestIDTxt сохраняет свое значение, но оба значения myDatePicker не имеют значения.

Вопрос: Как сохранить StartDate.SelectedDate и EndDate.SelectedDate между обратными передачами?

Решение: Как предлагалось несколько раз, удаление ReadOnly="true" на DateTxt сохраняло текстовое значение между постбэками. (Спасибо Радж Каймал !)

Затем я установил свойство SelectedDate (Date?) Путем Date.Parse автоматического ввода текстового значения в Page_Load () для этого пользовательского элемента управления, см. Код ниже.

Я никогда не использовал объект ViewState напрямую.

myDatePicker.ascx.vb (FINAL)

Imports System.Globalization
Partial Public Class myDate
    Inherits System.Web.UI.UserControl

    Public Property SelectedDate() As Date?
        Get 'Simply return the date'
            Return Me.DateTxt_CalendarExtender.SelectedDate
        End Get
        Set(ByVal value As Date?)
            If value = Nothing Then Exit Property
            Me.DateTxt_CalendarExtender.SelectedDate = value
            Me.DateTxt.Text = Format(value, Me.DateTxt_CalendarExtender.Format)
        End Set
    End Property

    Public Sub Refresh()
        Dim tempDate As Date 'SelectedDate is nullable Date (Date?)'
        Dim parseState As Boolean = False

        parseState = Date.TryParseExact(DateTxt.Text, _
                                        DateTxt_CalendarExtender.Format, _
                                        DateTimeFormatInfo.CurrentInfo, _
                                        DateTimeStyles.None, tempDate)
        If parseState Then 'if successful, set the date'
            Me.DateTxt_CalendarExtender.SelectedDate = tempDate
        End If
    End Sub

    Private Sub Page_Load(ByVal sender As Object, _
                          ByVal e As System.EventArgs) Handles Me.Load
        Me.Refresh()
    End Sub
End Class

myDatePicker.ascx.vb (ОРИГИНАЛ)

Partial Public Class myDate
    Inherits System.Web.UI.UserControl

    Public Property SelectedDate() As Date?
        Get
            Dim o As Object = ViewState("SelectedDate")
            If o = Nothing Then
                Return Nothing
            End If
            Return Date.Parse(o)
        End Get
        Set(ByVal value As Date?)
            ViewState("SelectedDate") = value
        End Set
    End Property
End Class

myDatePicker.ascx

<%@ Control Language="vb" CodeBehind="myDatePicker.ascx.vb"
    Inherits="Website.myDate" AutoEventWireup="false" %>

<%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" 
             tagprefix="asp" %>

<asp:TextBox ID="DateTxt" runat="server" ReadOnly="True" />
<asp:Image ID="DateImg" runat="server" ImageUrl="~/Calendar_scheduleHS.png"
              EnableViewState="True" EnableTheming="True" />

<asp:CalendarExtender ID="DateTxt_CalendarExtender" runat="server" Enabled="True"
                      TargetControlID="DateTxt" PopupButtonID="DateImg"
                      DefaultView="Days" Format="ddd MMM dd, yyyy"
                      EnableViewState="True"/>

Default.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb"
         Inherits="Website._Default" EnableEventValidation="false"
         EnableViewState="true" %>

<%@ Register TagPrefix="my" TagName="DatePicker" Src="~/myDatePicker.ascx" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
             TagPrefix="ajax" %>
<%@ Register Assembly="..." Namespace="System.Web.UI.WebControls"
             TagPrefix="asp" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
<body>
<form id="form1" runat="server">
<div class="mainbox">
      <div class="query">
          Start Date<br />
          <my:DatePicker ID="StartDate" runat="server" EnableViewState="True" />
          End Date
          <br />
          <my:DatePicker ID="EndDate" runat="server" EnableViewState="True" />
        <br/>
        <asp:TextBox ID="TestIdTxt" runat="server" /><br /> 
        <div class="query_buttons">
            <asp:Button ID="Button1" runat="server" Text="Query" />
        </div>
 </div>
 <asp:GridView ID="GridView1" ... >
 </form>
 </body>
 </html>

Default.aspx.vb

Imports System.Web.Services
Imports System.Web.Script.Services
Imports AjaxControlToolkit

Protected Sub Page_Load(ByVal sender As Object, _
                        ByVal e As EventArgs) Handles Me.Load

End Sub

Partial Public Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Button1_Click(ByVal sender As Object, _
                                ByVal e As EventArgs) Handles Button1.Click
        GridView1.DataBind()
    End Sub
End Class

Ответы [ 8 ]

3 голосов
/ 04 мая 2010

Ваше текстовое поле доступно только для чтения, поэтому оно не будет сохранять в состоянии просмотра никаких изменений текстового значения. Это функция безопасности для предотвращения несанкционированного доступа к элементам управления только для чтения.

Прежде всего, все ли работает нормально, если атрибут readonly удален?

Я хочу, чтобы пользовательский элемент управления был в точности таким, каким он был до обратной передачи (как по внешнему виду, так и по значению).

если это так, можете ли вы использовать css / jquery для того, чтобы текстовое поле выглядело отключенным?

2 голосов
/ 04 мая 2010

Я хочу, чтобы пользовательский элемент управления был точно что это было до обратной передачи (в и внешний вид, и ценность).

Вы можете попробовать использовать ControlState для этого.

В вашем обработчике инициализации:

protected override void OnInit(EventArgs e) 
{
    Page.RegisterRequiresControlState(this);
}

В другом месте под вашим контролем:

    protected override object SaveControlState()
    {
        NameValueCollection state = new NameValueCollection();
        state.Add("value", this.DateTxt.Text);
        return state;
    }

    protected override void LoadControlState(object savedState)
    {
        NameValueCollection state = (NameValueCollection)savedState;
        this.DateTxt.Text = state["value"].ToString();
    }

Я адаптировал это из некоторого кода, который лежал вокруг, поэтому вам, возможно, придется немного подправить его для своих целей. Среда выполнения ASP.NET будет вызывать эти два метода в течение жизненного цикла страницы, чтобы сохранить и восстановить значение этого текстового поля для вас независимо от ViewState.

1 голос
/ 05 мая 2010

CalendarExtender не работает должным образом с текстовыми полями только для чтения. Существует относительно простой обходной путь, хотя он выглядит немного грязным и не совсем подходит для веб-форм. Попробуйте поместить это в Page_Load:

DateTxt.Text = Request[DateTxt.UniqueID]

Очевидно, что если в некоторых случаях вы также заполняете текстовое поле из ViewState, вам также следует об этом помнить.

0 голосов
/ 04 мая 2010

В событии OnLoad вашего пользовательского элемента управления вы можете использовать значения, сохраненные в вашем viewstate, для заполнения элемента управления. (не 100%, если этот VB правильный)

Protected Sub Page_Load(ByVal sender As Object, _
                        ByVal e As EventArgs) Handles Me.Load
    Me.DateTxt_CalendarExtender.(property that sets the date) = Me.SelectedDate
    //or Me.DateTxt_CalendarExtender.(property that sets the date picked) = ViewState["SelectedDate"] As Date
End Sub
0 голосов
/ 04 мая 2010

Если я понимаю ваш вопрос, вам просто нужно перегрузить UserControl.DataBind в классе myDate.

Смотрите здесь для лучшей документации.

Если ваш компонент создан с использованием внутреннего компонента, такого как текстовое поле, вы можете сделать, как в следующем примере. Поэтому свяжите введенные или измененные данные с внутренним компонентом и убедитесь, что отслеживаете состояние, и сохраняйте / загружайте его при каждой обратной передаче.

Если вы рисуете свой собственный компонент, не забудьте переопределить привязку данных, потому что вам нужно записать, какой пользователь внес в состояние просмотра, но это намного сложнее.

Пример простого UserControl: WebUserControl1.ascx.vb:

    Public Class WebUserControl1
    Inherits System.Web.UI.UserControl

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub


    Public Property SelectedText() As String
        Get
            Return TextBox1.Text
        End Get
        Set(ByVal value As String)
            TextBox1.Text = value
        End Set
    End Property

    Public Overrides Sub DataBind()
        MyBase.OnDataBinding(EventArgs.Empty)
        ' Reset the control's state.
        ' Controls.Clear()
        ' Check for HasChildViewState to avoid unnecessary calls to ClearChildViewState.
        If HasChildViewState Then
            ClearChildViewState()
        End If
        ChildControlsCreated = True
        If Not IsTrackingViewState Then
            TrackViewState()
        End If
    End Sub


    Protected Overrides Sub LoadControlState(ByVal savedState As Object)
        SelectedText = savedState


    End Sub

    Protected Overrides Function SaveControlState() As Object
        Return SelectedText

    End Function
End Class

WebUserControl1.ascx:

<%@ Control Language="vb" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.vb" Inherits="WebApplication1.WebUserControl1" %>
PIPPO:
<asp:TextBox ID="TextBox1" runat="server" Width="384px"></asp:TextBox>

Default.aspx:

<%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc2" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

    <br />
    -----------------------------------<br />

    <uc2:WebUserControl1 ID="WebUserControl11" runat="server" SelectedText="aaaa" />
    <br />
    -----------------------------------<br />
    <asp:Button ID="Button1" runat="server" Text="Button" />
    <br />
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <br />

</asp:Content>

Default.aspx.vb

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        DataBindChildren()
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Label1.Text = WebUserControl11.SelectedText


    End Sub
End Class
0 голосов
/ 04 мая 2010

Вы должны иметь возможность добавить что-то подобное в свой календарь, чтобы автоматически отправлять вашу страницу при выборе даты:

OnClientDateSelectionChanged="document.getElementById('form1').submit();"

При необходимости вы можете заменить отправку JavaScript определенным щелчком кнопки или вызвать событие обратной передачи asp.net .

0 голосов
/ 30 апреля 2010

вот статья, которая должна помочь

http://msdn.microsoft.com/en-us/library/ms972975.aspx

В основном вам нужно создать событие, которое вызывает обратную передачу

0 голосов
/ 30 апреля 2010

Установите событие onclick кнопки для обработчика события в вашем коде:

<asp:Button ID="Button1" runat="server" Text="Query" OnClick="MyButtonClickEventHandler" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...