#c# #asp.net #stored-procedures #gridview #rowcommand
#c# #asp.net #хранимые процедуры #gridview #rowcommand
Вопрос:
У меня есть GridView, который показывает список ресторанов, и это данные из моей базы данных. В последнем столбце у меня есть ButtonField
. Когда пользователь нажимает на кнопку, RowCommand
срабатывает и появляется другой GridView с отзывами о выбранном ресторане.
Проблема, с которой я сталкиваюсь, заключается в том, что во время запуска события RowCommand второй GridView gvReviews
вообще не отображается.
- Я пытался установить для GridView
visible
значение true, но, похоже, это не работает. - Я пытался использовать вместо
TemplateField
сButton
a, но это тоже не работает. - Я пытался использовать
if (!IsPostback)
инструкцию
Вот фрагмент моих просмотров сетки:
<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
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);
}
Вот фрагмент методов, которые я использовал:
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
Комментарии:
1. Какой gridview не отображается?
gvRestaurants
?2. @KobyDouek the
gvReviews
3. Вы убедились, что это
p.GetReview(restID)
возвращает данные? Если он возвращает пустую таблицу данных, это может быть причиной.
Ответ №1:
Ваш GridView
не отображается, потому что вы привязываете его к a DataSet
вместо того, чтобы привязывать его непосредственно к a DataTable
внутри этого DataSet
.
Попробуйте изменить эту строку:
gvReviews.DataSource = p.GetReview(restID);
К этому:
gvReviews.DataSource = p.GetReview(restID).Tables[0];
Комментарии:
1. Я использовал
if (p.GetReview(restID).Tables[0].Rows.Count == 0) { string error = "dataset is empty"; ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" error "');", true); }
для проверки, и, по-видимому, он отображается как пустой.2. @pyuntae Так что это еще одна проблема. если в таблице нет строк, gridview отображаться не будет.
3. Но в моих таблицах есть данные. Означает ли это, что в моих хранимых процедурах ошибка?
4. Неважно. Я понял, что у меня был только один отзыв только для одного ресторана, и я проверял другие рестораны без отзывов. Спасибо. Проверка того, был ли набор данных пуст, решила проблему моего мозгового пердежа.
Ответ №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