0

たぶん、私はこれを間違った方法で考えています.ページがレンダリングされ、クライアント(Webブラウザ)に送信されることはわかっています。しかし、私は本当にこれを理解する必要があります。

質問 3 つの更新パネルを非同期で更新するにはどうすればよいですか? これをシミュレートするために、正しい番号が見つかり、イベントが発生した後に、毎回 1 秒を追加する for ループを作成しました。だから私がやりたいのは、これらの更新が完了したときにウェブブラウザで見ることができるようにすることです. 期間は次のようになります。

TIME
0,0235 (実際にすばやく発生することを示すための単なる数字)
ページで何が起こるか? ほぼ瞬時に、最初のラベルが 7 番で更新されます TIME
0,0235 + 1 秒 = 1,0235 ページで何が起こるか ほぼ瞬時に 2 番目のラベルが番号 8 で更新されます TIME
0,0235 + 1 秒 = 2,0235 ページで何が起こるか? ほぼ瞬時に 3 番目のラベルが 9 番に更新されます

最初にテキストを表示し、数秒後にリクエストの読み込みが完了したときに図を表示するページにアクセスしたことがありますか? では、正しい方法があるはずですか?

Heres 私のコード、私は CounterEventArgs クラスを投稿していません。それは機能し、質問には影響しません。

これが私の index.aspx です - 分離コード public partial class _Default : System.Web.UI.Page { private testClass _testet;

protected void Page_Load(object sender, EventArgs e)
{
    ScriptManager1.RegisterAsyncPostBackControl(Button1);  
}
void _testet_CounterFoundNumber(object sender, CounterEventArgs e)
{
    switch (e.labelnumber)
    {
        case 1:
            Label1.Text = e.positionen.ToString();            
            break;
        case 2:
            Label2.Text = e.positionen.ToString();        
            break;
        case 3:
            Label3.Text = e.positionen.ToString();        
            break;
    } 
}
protected void Button1_Click(object sender, EventArgs e)
{
    testClass testet = new testClass();
    _testet = testet;
    _testet.CounterFoundNumber += new testClass.CounterEventArgsHandler(_testet_CounterFoundNumber);
    _testet.count();
}
}

そしてソース

  <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Async="true"%>

  <!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">
 <head runat="server">
<title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>  
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
</asp:ScriptManager>
<asp:UpdatePanel ID="updatepanel1" runat="server" UpdateMode="Always">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</form>
</ContentTemplate>
</asp:UpdatePanel>

 <asp:UpdatePanel ID="updatepanel2" runat="server" UpdateMode="Always">
<ContentTemplate>
  <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
</form>
</ContentTemplate>
</asp:UpdatePanel>
 <asp:UpdatePanel ID="updatepanel3" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>

そして最後に私のテストクラス

public class testClass
{
public event CounterEventArgsHandler CounterFoundNumber; 
public delegate void CounterEventArgsHandler(object sender, CounterEventArgs e);
public int y = 1;

    protected virtual void OnCounterFoundNumber(CounterEventArgs e)
    {
        if (CounterFoundNumber != null)
        CounterFoundNumber.BeginInvoke(this, e, new AsyncCallback(this.ResultFoundNumber), null);
    }

    public void count()
    {          
        for (int i = 0; i < 10; i++)
        {
            if (i >= 7)
            {    
               OnCounterFoundNumber(new CounterEventArgs(i,y));
               y++;
               System.Threading.Thread.Sleep(1000);
            }              
        }
    }
    public void ResultFoundNumber(IAsyncResult ar)
    {
        CounterFoundNumber.EndInvoke(ar);
    }
}
4

1 に答える 1

1

コード ビハインドを記述する代わりに、Javascript のsetInterval メソッド()を使用してみてください。

JavaScript 関数では、部分的なポストパックを実行してパネルを更新するボタン クリック イベントをトリガーします。

必要に応じて、css プロパティにdisply:noneを設定して、ボタンを非表示にすることができます。

または、HTML 5 を使用している場合は、ASP.NetまたはWebSockets実装での COMET の実装を確認してください。

これがあなたを助けることを願っています!

于 2012-12-07T05:13:20.800 に答える