3

問題:

データベーステーブルに値があります。この値には、数値またはnullのいずれかを含めることができます。nullの場合、コントロールの1つのグループを表示したいと思います。nullでない場合は、別のコントロールグループを表示したいと思います。


以前の試み:

データベースの値に応じて、コードビハインドでコントロールを作成してみました。これはうまくいきました。ただし、ポストバック時にnull参照例外が発生します。ページがステートレスであるため、コントロールはポストバックに存在しません。ハンドラーでコントロールを構築していますpage_load(テーブル列の値によって異なります)。コントロールを作成しているのでpage_load、ポストバックに存在するべきではありませんか?

また、ボタンのイベントハンドラーでコントロールを再作成してみました。「このIDを持つコントロールはすでに存在します」という例外が発生します(おそらく、page_loadメソッドですでに作成しているためです)。

コントロールをセッションに保存する方法についての投稿をいくつか読みました。これは、本来よりも多くの作業のようです。

質問:

  1. 私はこれを間違った方法で行っていますか?これは単純なはずだったようですが、混乱に変わりつつあります。
  2. これが正しい方法である場合、セッション情報をどこに追加しますか?私は他の投稿を読んでいて、ちょっと迷っています

コード:

    int bookId;
    string empName;

    protected void Page_Load(object sender, EventArgs e)
    {
        if(int.TryParse(Request.QueryString["id"], out bookId))
        {
            //This is where the value in the database comes into play. If its null Book.GetCopyOwner
            // returns a string with length 0

            empName = Book.GetCopyOwner(bookId, Request.QueryString["owner"]);
            if (empName.Trim().Length > 0)
            {
                CreateReturnControls();
            }
            else
            {
                CreateCheckoutControls();
            }
        }
    }

    protected void ReturnButton_Click(object sender, EventArgs e)
    {
    }

    protected void CheckOut_Click(object sender, EventArgs e)
    {
        int bookId;
        if (int.TryParse(Request.QueryString["id"], out bookId))
        {
            TextBox userId = (TextBox)this.Page.FindControl("UserId");

            //WHEN I TRY TO USE THE TEXTBOX userId HERE, I GET NULL REFERENCE EXCEPTION

            BookCopyStatusNode.Controls.Clear();
            CreateReturnControls();
        }
    }

    protected void CopyUpdate_Click(object sender, EventArgs e)
    {
    }

    private void CreateCheckoutControls()
    {
        TextBox userId = new TextBox();
        //userId.Text = "Enter Employee Number";
        //userId.Attributes.Add("onclick", "this.value=''; this.onclick=null");
        userId.ID = "UserId";

        Button checkOut = new Button();
        checkOut.Text = "Check Out";
        checkOut.Click += new EventHandler(CheckOut_Click);

        TableCell firstCell = new TableCell();
        firstCell.Controls.Add(userId);

        TableCell secondCell = new TableCell();
        secondCell.Controls.Add(checkOut);

        BookCopyStatusNode.Controls.Add(firstCell);
        BookCopyStatusNode.Controls.Add(secondCell);
    }

    private void CreateReturnControls()
    {
        Label userMessage = new Label();
        userMessage.Text = empName + " has this book checked out.";

        Button returnButton = new Button();
        returnButton.Text = "Return it";
        returnButton.Click += new EventHandler(ReturnButton_Click);

        TableCell firstCell = new TableCell();
        firstCell.Controls.Add(userMessage);

        TableCell secondCell = new TableCell();
        secondCell.Controls.Add(returnButton);

        BookCopyStatusNode.Controls.Add(firstCell);
        BookCopyStatusNode.Controls.Add(secondCell);
    }
4

1 に答える 1

3

データベースの値に基づいて静的なコントロール セットを作成しているようです。必要なコントロールを含む 2 つのPanelvisibilityを単純に作成し、単純に true または false に設定しないのはなぜですか。

if (!Page.IsPostBack)
{
    if (int.TryParse(Request.QueryString["id"], out bookId))
    {
        empName = Book.GetCopyOwner(bookId, Request.QueryString["owner"]);
        var display = (empName.Trim().Length > 0);

        panelReturnControls.Visible = display;
        panelCheckoutControls.Visible = !display;
    }
}
于 2012-06-19T13:49:14.393 に答える