gpt4 book ai didi

c# - 基于数据库值的更改控制

转载 作者:行者123 更新时间:2023-11-30 16:24:03 24 4
gpt4 key购买 nike

问题:

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


以前的尝试:

我已经尝试根据数据库的值在后面的代码中创建控件。这奏效了。但是,在回发时我得到一个空引用异常。该控件在回发时不存在,因为页面是无状态的。我在 page_load 处理程序中构建控件(取决于表列的值)。由于我在 page_load 中创建控件,它们不应该存在于回发中吗?

我还尝试在按钮的事件处理程序中重新创建控件。我得到一个“已经有一个具有此 ID 的控件”异常(可能是因为我已经在 page_load 方法中创建了它)。

我阅读了一些关于如何在 session 中存储控件的帖子。这似乎比它应该做的更多的工作。

问题:

  1. 我是不是用错了方法?这看起来应该很简单,但现在却变得一团糟。
  2. 如果这是执行此操作的正确方法,我应该在哪里添加 session 信息?我一直在阅读其他帖子,但我有点迷路了

代码:

    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);
}

最佳答案

看起来您正在创建一组基于数据库值的静态控件。为什么不简单地有 2 Panel包含您想要的控件的 s,只需将它们的 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;
}
}

关于c# - 基于数据库值的更改控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11102246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com