Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在GridView控件中禁用此链接按钮?_C#_Asp.net_Linkbutton - Fatal编程技术网

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

    }
}