2

イベントを一覧表示する登録システムを開発しており、ユーザーはこれらのイベントに登録できます。各イベントには特定の座席数があります。私が今直面している問題は、登録数が座席数に達した場合でも、イベントはまだ利用可能であり、予約ボタンを無効にして予約プロセスを停止することはできません.

参考までに、次のデータベース設計があります。

Event Table: ID, Title, NumberOfSeats
BookingDetails Table: BookingID, EventID, Username
User Table: Username, Name

イベントは GridView コントロールに一覧表示され、イベントで予約するために GridView 内に LinkBut​​ton があります。私は ModalPopUp Extender コントロールを使用しています。これが、以下の ASP.NET コードに示すように LinkBut​​ton を使用している理由です。コード ビハインドの GrivView_RowDataBound 内で、各イベントの座席数と予約数を比較しました。予約数が座席数以上の場合。予約ボタンを無効にする必要があります。コードを書きましたが、それが機能しない理由と次のエラーが発生する理由がわかり ません: タイプ 'System.Web.UI.WebControls.GridView' のオブジェクトをタイプ 'System.Web にキャストできません。 UI.WebControls.LinkBut​​ton'.

ASP.NET コード:

<asp:GridView ID="ListOfAvailableEvents_GrivView" runat="server" AutoGenerateColumns="False"
                    DataKeyNames="ID" CellPadding="4" DataSourceID="SqlDataSource1" ForeColor="#333333"
                    GridLines="None" AllowPaging="True" PageSize="10" 
                    onrowdatabound="ListOfAvailableEvents_GrivView_RowDataBound">
                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" CssClass="generaltext" />
                    <Columns>
                        <asp:TemplateField HeaderText="">
                            <ItemTemplate>
                                <asp:LinkButton ID="lnkTitle" runat="server" CssClass="button" Text="Book &rarr;" OnClick="lnkTitle_Click"></asp:LinkButton>
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                        <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
                        <asp:BoundField DataField="Location" HeaderText="Location" SortExpression="Location" />
                        <asp:BoundField DataField="StartDateTime" HeaderText="Start Date & Time" SortExpression="StartDateTime" />
                        <asp:BoundField DataField="EndDateTime" HeaderText="End Date & Time" SortExpression="EndDateTime" />
                    </Columns>
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <HeaderStyle Font-Bold="True" CssClass="complete" />
                    <EditRowStyle BackColor="#999999" />
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                    <EmptyDataTemplate><h2>No Events Available</h2></EmptyDataTemplate>
                </asp:GridView>

コード ビハインド (C#) コード:

protected void ListOfAvailableEvents_GrivView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        int numberOfBookings = 0;
        int numberOfAvailableSeats = 0;

        string connString = "..........."
        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 (numberOfBookings >= numberOfAvailableSeats)
        {
            LinkButton bookButton = (LinkButton)(sender);
            bookButton.Enabled = false;
        }
    }

では、この問題を解決する方法を教えてください。

アップデート:

GridView には、さまざまなイベントが一覧表示されます。そのうちの1つを取り上げましょう。イベント A に空席が 3 つあり、予約数が 3 に達した場合、すべてのイベントではなく、このイベントに対してのみ [予約] ボタンを無効にする必要があります。そのため、予約数が空席数に達すると、このイベントのボタンは無効になります。

4

3 に答える 3

1

LinkBut​​ton を非表示にするには、以下のコードを使用してください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;
        }

    }
}

回答が得られる場合は、マークを付けてください。

于 2012-12-25T12:26:02.537 に答える
1

試す :

LinkButtton lbtn = new LinkButtton();
lbtn = (LinkButton)e.Row.FindControl("ButtonId"); 

その後lbtn、さらなる操作に使用します。

ありがとう

于 2012-12-25T08:53:31.103 に答える
0

RowDataBound イベントは GridView 用であるため、sender パラメーターを LinkBut​​ton にキャストすることはできません。

以下を含むようにコードを変更します。

if(numberOfBookings >= numberOfAvailableSeats)
{

if (e.Row.Cells[0].HasControls())
        {
            var button = e.Row.Cells[0].Controls[1] as LinkButton;

            button.Enabled = false;

        }
}

しかし、あなたがこれにどのように近づいているのか心配です。

RowDataBound イベントは、バインドされているデータソースのすべての行に対してトリガーされ、毎回データベースクエリを実行しています。

numberOfBookings と numberOfAvailableSeats を最初のクエリに含めることを試みることができます。これらは利用可能になり、毎回データベースにアクセスすることなく (行ごとに) 確認できます。

于 2012-12-25T09:12:30.840 に答える