【问题标题】:Gridview not showing after Gridview RowCommand event?Gridview RowCommand 事件后不显示 Gridview?
【发布时间】:2019-07-29 02:03:01
【问题描述】:

我有一个显示餐厅列表的 GridView,它是我数据库中的数据。在最后一栏中,我有一个ButtonField。当用户单击该按钮时,RowCommand 会触发,另一个 GridView 会显示所选餐厅的评论。

我遇到的问题是,当 RowCommand 事件被触发时,第二个 GridView gvReviews 根本没有出现。

  • 我尝试将 GridView 的 visible 设置为 true,但没有 似乎工作。
  • 我曾尝试将TemplateFieldButton 一起使用,但这也不起作用。
  • 我尝试过使用if (!IsPostback) 语句

这是我的 GridViews 的 sn-p:

<asp:GridView ID="gvRestaurants" runat="server" AutoGenerateColumns="false" OnRowCommand="gvRestaurants_RowCommand">
            <Columns>
                <asp:BoundField DataField="RestaurantID" HeaderText="ID" />
                <asp:BoundField DataField="RestName" HeaderText="Restaurant" />
                <asp:BoundField DataField="RestAddr" HeaderText="Address" />
                <asp:BoundField DataField="RestCity" HeaderText="City" />
                <asp:BoundField DataField="RestState" HeaderText="State" />
                <asp:BoundField DataField="RestZip" HeaderText="Zip Code" />
                <asp:BoundField DataField="CategoryDesc" HeaderText="Category" />
                <asp:ButtonField HeaderText="Reviews" CommandName="viewReviews" Text="View" ButtonType="Button" />
            </Columns>
        </asp:GridView>
        <asp:GridView ID="gvReviews" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="RestaurantID" HeaderText="ID" />
                <asp:BoundField DataField="RestName" HeaderText="Restaurant" />
                <asp:BoundField DataField="ReviewDate" HeaderText="Date of Review" />
                <asp:BoundField DataField="FoodQuality" HeaderText="Food Quality" />
                <asp:BoundField DataField="ServiceRating" HeaderText="Service" />
                <asp:BoundField DataField="AtmosphereRating" HeaderText="Atmosphere" />
                <asp:BoundField DataField="PriceRating" HeaderText="Price" />
                <asp:BoundField DataField="ReviewText" HeaderText="Review" />
            </Columns>
        </asp:GridView>

这是 aspx.cs 的 sn-p

protected void btnSearch_Click(object sender, EventArgs e)
        {
            gvRestaurants.Visible = true;
            gvAllRestaurants.Visible = false;
            DataSet ds = p.SearchByCategory(ddCategories.SelectedItem.Value, ddCategories2.SelectedItem.Value);
            gvRestaurants.DataSource = ds;
            gvRestaurants.DataBind();
        }

 protected void gvRestaurants_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "viewReviews")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                GridViewRow row = gvRestaurants.Rows[index];

                int restID = int.Parse(row.Cells[0].Text);

                gvReviews.DataSource = p.GetReview(restID);
                gvReviews.DataBind();

                gvRestaurants.Visible = false;
                gvReviews.Visible = true;
            }
            else
            {
                string error = "There are no reviews for this restaurant.";
                ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + error + "');", true);
            }

这是我使用的方法的 sn-p:

public DataSet SearchByCategory(string category1, string category2)
        {
            DBConnect objDB = new DBConnect();
            objCmd.Parameters.Clear();
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.CommandText = "GetRestaurantByCategory";

            SqlParameter sqlParameter = new SqlParameter("@theCategory", category1);
            SqlParameter sqlParameter2 = new SqlParameter("@theCategory2", category2);

            sqlParameter.Direction = ParameterDirection.Input;
            sqlParameter.SqlDbType = SqlDbType.VarChar;
            sqlParameter.Size = 50;

            sqlParameter2.Direction = ParameterDirection.Input;
            sqlParameter2.SqlDbType = SqlDbType.VarChar;
            sqlParameter2.Size = 50;

            objCmd.Parameters.Add(sqlParameter);
            objCmd.Parameters.Add(sqlParameter2);

            objDB.GetConnection().Open();
            DataSet ds = objDB.GetDataSetUsingCmdObj(objCmd);
            objDB.CloseConnection();

            return ds;
        }

        public DataSet GetReview(int restaurant)
        {
            DBConnect objDB = new DBConnect();
            objCmd.Parameters.Clear();
            objCmd.CommandType = CommandType.StoredProcedure;
            objCmd.CommandText = "GetReviewByRestaurantID";

            SqlParameter sqlParameter = new SqlParameter("@theRestaurantID", restaurant);

            sqlParameter.Direction = ParameterDirection.Input;
            sqlParameter.SqlDbType = SqlDbType.Int;
            sqlParameter.Size = 4;

            objCmd.Parameters.Add(sqlParameter);

            objDB.GetConnection().Open();
            DataSet ds = objDB.GetDataSetUsingCmdObj(objCmd);
            objDB.CloseConnection();

            return ds;
        }

这是我使用的存储过程:

CREATE PROCEDURE [dbo].GetRestaurantByCategory
    @theCategory varchar(50),
    @theCategory2 varchar(50)

AS
    SELECT rest.RestaurantID, rest.RestName, rest.RestAddr, rest.RestCity, rest.RestState, rest.RestZip, cat.CategoryDesc
    FROM Restaurants rest JOIN Categories cat ON rest.CategoryID = cat.CategoryID
    WHERE CategoryDesc = @theCategory OR CategoryDesc = @theCategory2

CREATE PROCEDURE [dbo].GetReviewByRestaurantID
    @theRestaurantID int

AS
    SELECT rest.RestaurantID, rest.RestName, rev.ReviewDate, rev.FoodQuality, rev.ServiceRating, rev.AtmosphereRating, rev.PriceRating, rev.ReviewText
    FROM Restaurants rest JOIN Reviews rev ON rest.RestaurantID = rev.RestaurantID
    WHERE Rest.RestaurantID = @theRestaurantID

【问题讨论】:

  • 哪个 gridview 不显示? gvRestaurants ?
  • @KobyDouek gvReviews
  • 你确认p.GetReview(restID)返回数据了吗?如果它返回一个空数据表,这可能是原因。

标签: c# asp.net stored-procedures gridview rowcommand


【解决方案1】:

您的GridView 未显示,因为您将其绑定到DataSet,而不是直接将其绑定到此DataSet 中的DataTable

尝试更改此行:

gvReviews.DataSource = p.GetReview(restID);

到这里:

gvReviews.DataSource = p.GetReview(restID).Tables[0];

【讨论】:

  • 我使用if (p.GetReview(restID).Tables[0].Rows.Count == 0) { string error = "dataset is empty"; ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + error + "');", true); } 进行检查,显然它显示为空。
  • @pyuntae 所以这是另一个问题。如果表格没有行,则不会显示gridview。
  • 但是我的表有数据。这是否意味着我的存储过程中有错误?
  • 没关系。我意识到我只有一家餐厅的评论,而我正在检查其他没有评论的餐厅。谢谢你。检查数据集是否为空解决了我的大脑放屁问题。
【解决方案2】:

使用这个查询

SELECT rest.RestaurantID, rest.RestName, rev.ReviewDate, rev.FoodQuality, rev.ServiceRating, rev.AtmosphereRating, rev.PriceRating, rev.ReviewText
    FROM Restaurants rest JOIN Reviews rev ON rev.RestaurantID = rest.RestaurantID
    WHERE Rest.RestaurantID = @theRestaurantID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多