问题:
我在数据库表中有一个值。该值可以包含一个数字,也可以为空。如果它为空,我想显示一组控件。如果它不为空,我想展示另一组控件。
以前的尝试:
我尝试根据数据库的值在后面的代码中创建控件。这行得通。但是,在回发时,我得到一个空引用异常。回发时控件不存在,因为页面是无状态的。我正在page_load
处理程序中构建控件(取决于表列的值)。由于我正在创建控件,page_load
它们不应该存在于回发中吗?
我还尝试在按钮的事件处理程序中重新创建控件。我得到一个“已经有一个具有此 id 的控件”异常(可能是因为我已经在page_load
方法中创建了它)。
我阅读了一些关于如何在会话中存储控件的帖子。这似乎比应该做的工作更多。
问题:
- 我会以错误的方式解决这个问题吗?这看起来应该很简单,但现在变得一团糟。
- 如果这是正确的方法,我在哪里添加会话信息?我一直在阅读其他帖子,我有点迷路了
代码:
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);
}