0

こんにちは、「The Hang Men」というゲームを作成するという学校の課題があります。このゲームを作成し始めましたが、解決できない大きな問題が 1 つあります。

ボタンをクリックするたびに。すべての要素がページから消えます。その理由はわかっています。ポストバックが原因です。

しかし、ボタンからポストバックを無効にすると、何も起こりません。

どうすれば行くことができますか?ボタンをクリックして、ポストバックを作成せずにイベントを実行するにはどうすればよいですか?

これはコードです..

abc ltr;

Words word = null;

static Label [] lbl = null;

static Button[] btn = null;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        SetBord();
        SetWords();
    }

}

private void SetWords()
{
    word = new Words();
    Random ids = new Random();
    string temp_word;
    int id = ids.Next(0, word.GetListSize());
    temp_word = word.GetWords(id);

    lbl = new Label[word.GetWordLenght(id)];

    for (int i = 0; i < word.GetWordLenght(id); i++)
    {
        lbl[i] = new Label();
        lbl[i].ID ="lbl"+i;
        lbl[i].CssClass = "LetterStyle";
        lbl[i].Text = Convert.ToString(word.get_chars(id,i));
        this.Words_Panel.Controls.Add(lbl[i]);
    }


}
private void SetBord()
{
    ltr = new abc();

    btn = new Button[27];
    for (int i = 0; i<27; i++)
    {
      btn[i] = new Button();  
      btn[i].ID = "btn" + i;
      btn[i].Attributes.Add("runat", "server");
      btn[i].Click += new EventHandler(LetterClicked);
      btn[i].Width = new Unit("100px");
      btn[i].Height = new Unit("49px");
      btn[i].Text = "" + ltr.getLetters(i); 
      this.Letters.Controls.Add(btn[i]);
    }


}

protected void LetterClicked(object sender, EventArgs e)
{
    Button letter = (Button)sender;
    letter.Enabled = false;
    lbl[0].Text = letter.Text;
}   
4

3 に答える 3

1

あなたが遭遇したのは、動的なコントロールの作成を行うときの現象です。ボタンとラベルをコードで動的に作成しているため、これらのコントロールは、ページのリロード時に「保持」(記憶) されません (ページのリロード/ポストバックのたびに失われます)。

動的に生成する以外に問題に対処する方法がない場合。次に、誰もが動的コントロールの作成を処理する方法と同じように行う必要があります。

ここにいくつかのポインタがあります:

  • コントロールを作成するときは、作成したコントロールを「記憶」する必要があります (viewstate? session?)。
  • ページの再読み込み/更新時、Page_Load イベントで、これらのコントロールを処理する前にすべてのコントロールを再作成する必要があります。これは、これらのコントロールからのイベント/値を後で処理する場合に特に当てはまります。それらが再作成されない場合、それらに設定した値は IIS によって「保持」されません (IIS がコントロールを見つけられず、送信された値が破棄されるため)。

上記の設計/プログラムを構築する必要があります。幸運を!

于 2013-01-28T12:15:59.053 に答える
0

Page_Init イベントを追加

protected void Page_Init(object sender, EventArgs e)
{

        SetBord();
        SetWords();
}
于 2013-01-28T12:07:15.677 に答える
0

ポストバックがない場合、ゲームを動作させることはできません。または、JavaScript ですべてを行う必要があります (ただし、それがこのゲームを作成する目的ではないと思います)。

コントロールを動的に作成するため、ポストバックごとに再作成する必要があります (Page_Load 関数の条件を削除するだけです)。

また、あるポストバックから別のポストバックにゲーム データを永続化する必要があります

于 2013-01-28T12:07:46.417 に答える