3

Web ページにいくつかのボタンがあり、countClick メソッドを使用してユーザーが押したクリック数をチェックすることで、ボタンのクリックを制限しようとしていました。以下のコードでは、ユーザーが最初のボタンをクリックすると、2 番目のボタンが自動的にクリックされます。代わりに 2 番目のボタンを選択すると、3 番目のボタンも自動的にクリックされ、残りのボタンも同様にクリックされます。ただし、私の場合、1回のクリックで2つのボタンがクリックされるため、1回しかクリックできません。そのため、一度クリックすると、2 回目はクリックできません。

私の問題は、countClick メソッドが機能していないことです。ページを実行すると、すべてのボタンを選択でき、ユーザーがボタンを 1 回クリックするだけに制限されません。

ここに私の.csコードがあります:

protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Text = "Booked";
    Button1.BackColor = System.Drawing.Color.Blue;
    Button2.Text = "Booked";
    Button2.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button2_Click(object sender, EventArgs e)
{
    Button2.Text = "Booked";
    Button2.BackColor = System.Drawing.Color.Blue;
    Button3.Text = "Booked";
    Button3.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button3_Click(object sender, EventArgs e)
{
    Button3.Text = "Booked";
    Button3.BackColor = System.Drawing.Color.Blue;
    Button4.Text = "Booked";
    Button4.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}
protected void Button4_Click(object sender, EventArgs e)
{
    Button4.Text = "Booked";
    Button4.BackColor = System.Drawing.Color.Blue;
    countButtonClick();
}

.cs の countClick メソッドは次のとおりです。

private void countButtonClick()
{
    int counter = 0;
    counter++;
    if (counter >= 1)
    {
        Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
    }
}
4

3 に答える 3

7

セッションcounter変数として保存します。

関数内で宣言しているため、関数へのその呼び出しの特定のインスタンスに対して一意です。したがって、毎回 0 にリセットされます。

private void countButtonClick()
{    
    int counter = 0;
    if (!(Session["counter"])){
       counter = (int)Session["counter"];
    }
    counter++;
    Session["counter"] = counter;

    if (counter >= 1)
    {
        Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
    }
}

次に、Page Load メソッドに以下を追加して、更新が行われたときにセッション値が失われるようにします。

if (!(Page.IsPostBack)){
   Session["counter"] = null;
}
于 2012-07-24T14:41:13.280 に答える
4

ここには 2 つの問題があります。

まず、counterセッション変数である必要があります。次に、ページ上の何かを変更する前に countClick() を呼び出して、bool成功したかどうかを確認できるように戻す必要があります。

private bool countClick()
{
    if (Session["clicks"] == null)
    {
        Session["clicks"] = 1;
        return true;
    }
    if (++((int)Session["clicks"]) > 1)
    {
         Response.Write("...");
         return false;
    }
    return true;
}


protected void Button1_Click(object sender, EventArgs e)
{
    if (countClick())
    {
        Button1.Text = "Booked";
        Button1.BackColor = System.Drawing.Color.Blue;
        Button2.Text = "Booked";
        Button2.BackColor = System.Drawing.Color.Blue;
    }
}
于 2012-07-24T14:49:24.273 に答える
3

メソッドcountButtonClickcounter、メソッド内で宣言することにより、ローカル スコープの変数として使用します。これは、メソッドが呼び出されるたびにカウンターが作成され、0 に初期化されることを意味します。さらに、クリック数はポストバック間で保持されません。カウンター宣言を の外に移動しても、ページのライフサイクルcountButtonClickの仕組みにより、ボタンがクリックされるたびにカウンター変数が 0 にリセットされます。これを解決する方法は、セッションまたはビュー ステートなどの何らかの方法でカウンターを保存することです。

private int counter = 0;
protected void Page_Load()
{
   if(!Page.IsPostback)
   {
      ViewState["MyClickCounter"] = 0;
   }
   else
   {
      counter = (int)ViewState["MyClickCounter"];
   }
}
private void countButtonClick()
{
   counter++;
   ViewState["MyClickCounter"] = counter;
   if (counter >= 1)
   {
      Response.Write("You can only select 2 slots! " + DateTime.Now.ToString());
   }
}

ページで何をする必要があるかによって、reset メソッドを追加することもできます。

于 2012-07-24T14:42:40.393 に答える