10

2つの入力要素を持つASP.NETページがあります。

  1. 読み取り専用のTextBox。このTextBoxは、CalendarExtenderのTargetControlです。
  2. AutoPostBack=trueのDropDownList

コードは次のとおりです。

<table border="0" cellpadding="0" cellspacing="0">
  <tr><td colspan="2">Date:</td></tr>
  <tr><td colspan="2">
    <asp:TextBox ID="dateTextBox" runat="server" ReadOnly="true" />
    <ajax:CalendarExtender ID="datePicker" runat="server" Format="MM/dd/yyyy" OnLoad="datePicker_Load" TargetControlID="dateTextBox" />
  </td></tr>

  <tr><td colspan="2">Select an Option:</td></tr>
  <tr>
    <td>Name:&nbsp;</td>
    <td><asp:DropDownList ID="optionsDropDownList" runat="server" AutoPostBack="true"  
      OnLoad="optionsDropDownList_Load" 
      OnSelectedIndexChanged="optionsDropDownList_SelectedIndexChanged" 
      DataTextField="Name" DataValueField="ID" />
  </td></tr>

  <tr><td><asp:Button ID="saveButton" runat="server" Text="Save" OnClick="saveButton_Click" /></td></tr>
</table>

DropDownListがポストバックすると、datePickerを使用してユーザーが選択した日付が現在の日付にリセットされます。さらに、dateTextBoxのTextプロパティを見ると、string.Emptyと同じです。

ユーザーがPostBackで選択した日付を保持するにはどうすればよいですか?

4

9 に答える 9

12

確かに、他の人がすでに示唆しているようreadonlyに、フィールドをマークアップではなく動的に設定し、Page_Load()ポストバック中に誤って値をリセットしないようにする必要があります...

...しかし、オブジェクトには強制的に変更する必要がある日付の内部コピーがあるPage_Load()ため、内部で次のことも行う必要があります。CalendarExtender

if (IsPostBack)  // do this ONLY during postbacks
{
    if (Request[txtDate.UniqueID] != null)
    {
        if (Request[txtDate.UniqueID].Length > 0)
        {
            txtDate.Text = Request[txtDate.UniqueID];
            txtDateExtender.SelectedDate = DateTime.Parse(Request[txtDate.UniqueID]);
        }
    }
}
于 2012-04-15T04:20:57.800 に答える
11

テキスト ボックスが読み取り専用であることが、この問題の原因のようです。バインドされたイベントのいずれにもコードを使用せずに問題を再現しましたが、日付はまだ消えていました。しかし、テキスト ボックスを ReadOnly=False に変更すると、問題なく動作しました。テキストボックスを読み取り専用にする必要がありますか、それとも無効にするか、入力されている日付を検証できますか?

編集:わかりました、私はあなたに答えがあります。このフォーラムの質問によると、読み取り専用コントロールはサーバーにポストバックされません。したがって、ポストバックを行うと、読み取り専用コントロールの値が失われます。コントロールを読み取り専用にする必要はありません。

于 2009-06-05T18:38:58.483 に答える
3
protected void Page_Load(object sender, EventArgs e)
{
    txt_sdate.Text = Request[txt_sdate.UniqueID];
}
于 2011-06-02T11:46:54.983 に答える
2

ポストバック後にテキストボックスの内容を記憶しておき、それを読み取り専用コントロールとして保持したい場合は、マークアップから readonly 属性を削除し、コードビハインド ページロードにこれを追加する必要があります。

protected void Page_Load(object sender, EventArgs e){
    TextBox1.Attributes.Add("readonly", "readonly");
    // ...
}
于 2011-12-22T10:21:03.467 に答える
1

この問題の解決策は、Request.Form コレクションを利用することです。このコレクションには、サーバーにポストバックされるすべてのフィールドの値と、JavaScript などのクライアント側スクリプトを使用して設定された値が含まれているためです。

したがって、サーバー側で値を取得する方法を少し変更する必要があります。

C#

protected void Submit(object sender, EventArgs e)
{
   string date = Request.Form[txtDate.UniqueID];
}
于 2011-11-17T00:56:54.403 に答える
0

ReadOnly="False" を設定する代わりに、Enabled="False" を設定します。これで問題が解決するはずです。

于 2009-12-04T08:21:03.897 に答える
0

あなたの datePicker_Load が何かを設定していて、それがポストバックにあるかどうかを確認していないと思われます。それは毎回発生し、「リセット」されているように見えます。

于 2009-06-05T18:43:30.720 に答える
0

@taedaの答えは私にとってはうまくいきました。参考までに、誰かがenabled = "false"代わりに使用すると、null 例外がスローされるreadonly = "true"ため、その答えを使用できなくなります。Request[TxtDate.UniqueId]

于 2016-12-17T02:30:28.813 に答える
-1

特定のテキストボックスの値を設定 readonly = trueした後、サーバーに返されないため、保存の問題ではありません

使っcontentEditable="false"作った readonly = false

Calendar Extender の選択以外の値が入力されないようにすると、テキスト ボックスの値もサーバーに返されます。

于 2013-10-25T05:21:36.133 に答える