2010-04-30 3 views
1

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

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

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

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

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

myDatePicker.ascx.vb (ЗАВЕРШЕНИЕ)

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 
+0

Я не вижу, где вы используете какие-либо значения из пользовательского элемента управления, можете ли вы показать эту часть? Или это просто, что вы хотите, чтобы myDatePicker показывал значение, которое ранее было выбрано пользователем, прежде чем нажать Button1? –

+0

Когда вы говорите «как я могу включить postback», вы спрашиваете: «Как я могу контролировать свой статус/после/после передачи»? Это может быть источником путаницы среди других плакатов (и я). – mwilson

+0

Да. Я обновил вопрос соответствующим образом. Благодаря! – Steven

ответ

3

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

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

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

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

0

Установить OnClick событие кнопки на обработчик событий в коде:

<asp:Button ID="Button1" runat="server" Text="Query" OnClick="MyButtonClickEventHandler" /> 
+0

Я добавил свой код, показывая функцию, которую вызывает кнопка1. – Steven

+0

@Steven, но где вы говорите кнопке, что это событие? – Earlz

+2

'Protected Sub Button1_Click (...) Ручки Button1.Click' – Steven

0

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

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

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

+1

Пожалуйста, уточните. Кнопка вызывает обратную передачу. – Steven

-1

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

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

Вы можете заменить отправку JavaScript при помощи конкретной кнопки, если необходимо, или call an asp.net postback event.

2

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

Для этого можете использовать 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.

+0

Не работает. Когда я отправляю страницу, пользовательские элементы управления не сохраняют свои значения и отображаются пустым. – Steven

0

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

Посмотрите here на предмет лучшей документации.

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

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

Пример простой 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

DataBind? Что такое DataSource? – Steven

+0

Надеюсь, что у вас все проблемы, и я отредактировал сообщение на простом примере. – Guaido79

0

В событии OnLoad вашего пользовательского элемента управления вы можете использовать значения, сохраненные в вашем представлении, для заполнения элемента управления. (Не 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

Сделайте то же самое для текстового поля и img. –

+0

Это тоже не сработало. Кроме того, в 'Page_Load()' значение «Me.ViewState.Count» равно нулю. – Steven

+0

Вам нужно будет поместить некоторые данные в SelectedDate в какой-то момент. –

1

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

DateTxt.Text = Request[DateTxt.UniqueID] 

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