1

画面に 2 つの UpdatePanels があります。1 つはテキスト ボックスがあり、もう 1 つはグリッドビューです。5 秒ごとにグリッドビューを更新するタイマー (UpdatePanel の外部) があります。テキストボックスを含む UpdatePanel にはボタン (UpdatePanel の外側) があり、ボタンを押すと、テキストボックスに入力された内容が DB に追加され、テキストボックスはすべて UpdatePanel (ajax、ページの読み込みなし) を介してクリアされます。

私が抱えている問題は、タイマーにリンクされている UpdatePanel がグリッドビューを更新すると、テキスト ボックスからフォーカスが奪われることです。codebdehind "System.Web.UI.ScriptManager.GetCurrent(this).SetFocus(this.txtNewComment);" を追加することで、フォーカスを与えることができます。ただし、カーソルはテキストボックスの先頭に配置されます。カーソルが最後ではなく最初にあるため、何かを入力している最中に入力している内容が台無しになります。

タイマーが UpdatePanel をトリガーしたときにカーソルをテキストボックス内の正確な位置に保つ方法についてのアイデアはありますか?

通常、Select()ここ ( http://msdn.microsoft.com/en-us/library/ms752349.aspx ) で説明されているようにテキスト ボックスの機能を使用しますが、Select() は ASP.NET for MS には存在しないようです。ボタン。

4

2 に答える 2

2

両方の UpdatePanels に属性を設定してみてくださいUpdateMode="Conditional"

次の例では、テキスト ボックスはフォーカスを失いません。

<asp:UpdatePanel ID="TextBoxUpdatePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:TextBox ID="PanelTextBox" runat="server"></asp:TextBox>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Literal ID="TimeLiteral" runat="server"></asp:Literal>
        <asp:Timer ID="myTimer" runat="server" OnTick="myTimer_Tick">
        </asp:Timer>
    </ContentTemplate>
</asp:UpdatePanel>

そして背後にあるコード

protected void Page_Load(object sender, EventArgs e)
{
    if (!this.IsPostBack) {
        PanelTextBox.Focus();
        myTimer.Interval = 3000;
        myTimer.Enabled = true;
    }
}

protected void myTimer_Tick(object sender, EventArgs e)
{
    System.Threading.Thread.Sleep(2000);
    TimeLiteral.Text = DateTime.UtcNow.Ticks.ToString();
}
于 2013-10-07T20:48:10.423 に答える