3

问题:

我在数据库表中有一个值。该值可以包含一个数字,也可以为空。如果它为空,我想显示一组控件。如果它不为空,我想展示另一组控件。


以前的尝试:

我尝试根据数据库的值在后面的代码中创建控件。这行得通。但是,在回发时,我得到一个空引用异常。回发时控件不存在,因为页面是无状态的。我正在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 个Panel包含您想要的控件并简单地将它们设置visibility为 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 回答