C# 如何在GridView控件中禁用此链接按钮?
我正在开发一个注册系统,列出事件,用户将能够在这些事件中注册。每个活动都有特定数量的座位。我现在面临的问题是,即使注册数量达到了座位数量,活动仍然可以进行,并且我无法通过禁用预订按钮来停止预订过程 供您参考,我有以下数据库设计:C# 如何在GridView控件中禁用此链接按钮?,c#,asp.net,linkbutton,C#,Asp.net,Linkbutton,我正在开发一个注册系统,列出事件,用户将能够在这些事件中注册。每个活动都有特定数量的座位。我现在面临的问题是,即使注册数量达到了座位数量,活动仍然可以进行,并且我无法通过禁用预订按钮来停止预订过程 供您参考,我有以下数据库设计: Event Table: ID, Title, NumberOfSeats BookingDetails Table: BookingID, EventID, Username User Table: Username, Name 事件将在GridView控件中列出,
Event Table: ID, Title, NumberOfSeats
BookingDetails Table: BookingID, EventID, Username
User Table: Username, Name
事件将在GridView控件中列出,GridView中有一个用于在事件中预订的链接按钮。我使用的是ModalPopUp Extender控件,这就是为什么我要使用链接按钮,如下面的ASP.NET代码所示。在GrivView_RowDataBound的代码中,我比较了每个活动的座位数和预订数。如果预订数量大于或等于座位数量。应禁用“预订”按钮。我编写了代码,但我不知道为什么它不能与我一起工作,以及为什么我会出现以下错误:
无法将“System.Web.UI.WebControls.GridView”类型的对象强制转换为“System.Web.UI.WebControls.LinkButton”类型。
ASP.NET代码:
那么您能告诉我如何解决这个问题吗?
更新:
GridView列出了许多不同的事件。让我们拿一个。如果活动A有3个可用座位,且预订数量达到3,则“预订”按钮应仅对此活动禁用,而不是对所有活动禁用。因此,当预订数量达到可用座位数时,该按钮将被禁用。尝试:
LinkButtton lbtn = new LinkButtton();
lbtn = (LinkButton)e.Row.FindControl("ButtonId");
然后使用lbtn
进行进一步操作
感谢RowDataBound事件用于GridView,因此无法将sender参数强制转换为LinkButton 修改代码以包括以下内容
if(numberOfBookings >= numberOfAvailableSeats)
{
if (e.Row.Cells[0].HasControls())
{
var button = e.Row.Cells[0].Controls[1] as LinkButton;
button.Enabled = false;
}
}
但我担心你是如何做到这一点的
RowDataBound事件会触发数据源中绑定到它的每一行,并且每次都要执行数据库查询
您可以尝试在初始查询中包含numberOfBookings和NumberOfAvailableSets,您可以每次(每行)检查它们,而不必每次都去数据库。请使用下面的代码隐藏链接按钮,即
lnkTitle
代码如下:
protected void ListOfAvailableEvents_GrivView_RowDataBound(object sender, GridViewRowEventArgs e)
{
int numberOfBookings = 0;
int numberOfAvailableSeats = 0;
string connString = "Data Source=appServer\\sqlexpress;Initial Catalog=EventRegMgnSysDB;Integrated Security=True;";
string selectCommand = @"SELECT COUNT(*) AS UserBookingsCount, dbo.Events.NumberOfSeats
FROM dbo.BookingDetails INNER JOIN
dbo.Events ON dbo.BookingDetails.EventID = dbo.Events.ID
GROUP BY dbo.Events.NumberOfSeats";
using (SqlConnection conn = new SqlConnection(connString))
{
//Open DB Connection
conn.Open();
using (SqlCommand cmd = new SqlCommand(selectCommand, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
if (reader != null)
if (reader.Read())
{
numberOfBookings = Int32.Parse(reader["UserBookingsCount"].ToString());
numberOfAvailableSeats = Int32.Parse(reader["NumberOfSeats"].ToString());
}
}
//Close the connection
conn.Close();
}
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton lnkTitle = (LinkButton )e.Row.FindControl("lnkTitle");
if (numberOfBookings >= numberOfAvailableSeats)
{
lnkTitle.Visible = false;
}
else
{
lnkTitle.Visible = true;
}
}
}
如果你能得到你的答案,请记下来 感谢您的帮助,但我出现以下错误,我不知道原因。
指定的参数超出了有效值的范围。参数名称:索引
,此代码行:var-button=e.Row.Cells[0]。控件[1]为LinkButton
你能帮我修一下吗?@technology在尝试访问索引之前,你确定要检查单元格是否有控件吗?if(e.Row.Cells[0].HasControls())感谢您的帮助,但我遇到以下错误:对象引用未设置为对象的实例。@technology在(LinkButton)e.Row.FindControl(“ButtonId”)之前使用new关键字;(在(LinkButton)之前使用new关键字是什么意思?e.Row.FindControl(“ButtonId”);
)首先,感谢您的回答。我试过了,当一个可用活动的注册数达到可用座位数时,它将禁用此活动以及其他活动的按钮。它应该只对该事件禁用按钮,而不是对所有事件禁用按钮。您好,您需要按行隐藏或隐藏整个列按钮。我想如果(numberOfBookings>=NumberOfAvailableSets)那么你想隐藏然后像下面这样改变如果(numberOfBookings>=NumberOfAvailableSets){lnkTitle.Visible=false;}否则{lnkTitle.Visible=true;}我这样做了,仍然得到了同样的结果。它会禁用所有事件的按钮。请告诉我何时隐藏按钮以及何时显示按钮?GridView列出了许多不同的事件。让我们拿一个。如果活动A有3个可用座位,且预订数量达到3,则“预订”按钮应仅对此活动禁用,而不是对所有活动禁用。因此,当预订数量达到可用座位数时,该按钮将被禁用。
if(numberOfBookings >= numberOfAvailableSeats)
{
if (e.Row.Cells[0].HasControls())
{
var button = e.Row.Cells[0].Controls[1] as LinkButton;
button.Enabled = false;
}
}
protected void ListOfAvailableEvents_GrivView_RowDataBound(object sender, GridViewRowEventArgs e)
{
int numberOfBookings = 0;
int numberOfAvailableSeats = 0;
string connString = "Data Source=appServer\\sqlexpress;Initial Catalog=EventRegMgnSysDB;Integrated Security=True;";
string selectCommand = @"SELECT COUNT(*) AS UserBookingsCount, dbo.Events.NumberOfSeats
FROM dbo.BookingDetails INNER JOIN
dbo.Events ON dbo.BookingDetails.EventID = dbo.Events.ID
GROUP BY dbo.Events.NumberOfSeats";
using (SqlConnection conn = new SqlConnection(connString))
{
//Open DB Connection
conn.Open();
using (SqlCommand cmd = new SqlCommand(selectCommand, conn))
{
SqlDataReader reader = cmd.ExecuteReader();
if (reader != null)
if (reader.Read())
{
numberOfBookings = Int32.Parse(reader["UserBookingsCount"].ToString());
numberOfAvailableSeats = Int32.Parse(reader["NumberOfSeats"].ToString());
}
}
//Close the connection
conn.Close();
}
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton lnkTitle = (LinkButton )e.Row.FindControl("lnkTitle");
if (numberOfBookings >= numberOfAvailableSeats)
{
lnkTitle.Visible = false;
}
else
{
lnkTitle.Visible = true;
}
}
}