ورود

View Full Version : سوال: صفر نشان دادن تعداد ردیف ها در گریدویو با وجود اطلاعات داخل آن



arash69
پنج شنبه 01 خرداد 1393, 15:09 عصر
سلام به همه دوستان.
در رابطه با گریدویو سوالی داشتم؛
پس از اینکه قابلیت صفحه بندی رو برای گریدویو فعال کردم و تابع PageIndexChanging رو هم تعریف کردم؛
حالا با وجود اطلاعات داخل گریدویو، اما تعداد ردیف های اون رو صفر نشون میده.
توابع به شکل زیر هستند:
تابع PageIndexChanging:

protected void products_table_indexChanging(object sender, GridViewPageEventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["dbcon1"].ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Products";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
con.Open();
da.Fill(ds);
con.Close();
products_table.PageIndex = e.NewPageIndex;
products_table.DataSource = ds;
products_table.DataBind();
}


تابع PageLoad که گریدویو رو پر میکنه:

protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["dbcon1"].ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Products";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
con.Open();
da.Fill(ds);
con.Close();


if (!Page.IsPostBack)
{
products_table.DataSource = ds;
products_table.DataBind();
}
}


و تابع حذف ردیف های تیک خورده در گریدویو:

protected void productrmv(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["dbcon1"].ConnectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "DELETE FROM Products WHERE id=@p1";
SqlCommand cmdImgName = new SqlCommand();
cmdImgName.Connection = con;
cmdImgName.CommandText = "SELECT imgName FROM Products WHERE id=@p1";
cmd.Parameters.Add("@p1",SqlDbType.Int);
cmdImgName.Parameters.Add("@p1",SqlDbType.NVarChar);
string imgName = null;
bool chkd = false;
foreach (GridViewRow gvRow in products_table.Rows)
{
CheckBox chkBox = (CheckBox)gvRow.FindControl("checkRemove");
if (chkBox.Checked)
{
cmd.Parameters["@p1"].Value = products_table.DataKeys[gvRow.RowIndex].Value;
cmdImgName.Parameters["@p1"].Value = products_table.DataKeys[gvRow.RowIndex].Value;
con.Open();
SqlDataReader dr = cmdImgName.ExecuteReader();
if (dr.Read())
{
imgName = dr["imgName"].ToString();
}
dr.Close();
cmd.ExecuteNonQuery();
con.Close();
chkd = true;
if (File.Exists(Server.MapPath(@"img\products\" + imgName)))
{
File.Delete(Server.MapPath(@"img\products\" + imgName));
}
}
}
if (chkd)
{
Response.Redirect("done.aspx");
}
}


ممنون میشم راهنمایی کنید که چرا تعداد ردیف ها رو توی تابع بالا، داخل حلقه ی froeach ، صفر نشون میده.

parvizwpf
پنج شنبه 01 خرداد 1393, 16:45 عصر
product_table اصلا دیتا برمیگردونه؟

arash69
پنج شنبه 01 خرداد 1393, 21:44 عصر
product_table اصلا دیتا برمیگردونه؟

بله داده ها رو نمایش میده، صفحه بندیش هم مشکل نداره، با کلیک شماره صفحه هم میره اون یکی صفحه،
اما وقتی دکمه مربوط به حذف داده رو میزنم، همه داده ها محو میشن و کلا گریدویو رو نشون نمیده دیگه و اون رکورد هم حذف نمیشه.

arash69
جمعه 02 خرداد 1393, 21:17 عصر
از دوستان کسی نیست در این مورد راهنمایی کنه؟

parvizwpf
شنبه 03 خرداد 1393, 13:42 عصر
ببینید من اینجوری نمیتونم چیزی بفهمم . شما بهتره که بریک پوینت بذارید و خط به خط تریس کنید و مشکل رو پیدا کنید.

arash69
شنبه 03 خرداد 1393, 20:42 عصر
ببینید من اینجوری نمیتونم چیزی بفهمم . شما بهتره که بریک پوینت بذارید و خط به خط تریس کنید و مشکل رو پیدا کنید.

اتفاقا تریس هم میکنم؛ و مشکل دقیقا همینیه که میگم؛ که تعداد سطر های گریدویو رو صفر نشون میده و اصلا داخل حلقه foreach وارد نمیشه.

mRizvandi
شنبه 03 خرداد 1393, 23:19 عصر
دوست عزیز چون کل کدهای صفحه نیست، نمیشه تشخیص داد، این کدها (به نظر من) مشکلی ندارند. فقط نگفتید که اون دکمه چی هست و کجا هست و چطوری داره کال میشه؟

حدس میزنم که 1- یا خاصیت EnableViewState مقدارش False هست یا 2- در یک رویداد دیگه گرید داره خالی میشه.
پیشنهاد:
اول اینکه کدهای مربوط به پر کردن گرید رو همه رو ببرید داخل یک متد مثلا به نام BindProductTable و هر جا که نیاز بود اون متد رو کال کنید که نیاز نباشه کدها رو مدام تکرار کنید که حتما خطا هم بوجود خواهد آمد.
حالا یک بریک پوینت داخل این متد بذارید ببینید که چند بار و کجاها و با چه ترتیبی داره کال میشه.

arash69
یک شنبه 04 خرداد 1393, 10:24 صبح
دوست عزیز چون کل کدهای صفحه نیست، نمیشه تشخیص داد، این کدها (به نظر من) مشکلی ندارند. فقط نگفتید که اون دکمه چی هست و کجا هست و چطوری داره کال میشه؟

حدس میزنم که 1- یا خاصیت EnableViewState مقدارش False هست یا 2- در یک رویداد دیگه گرید داره خالی میشه.
پیشنهاد:
اول اینکه کدهای مربوط به پر کردن گرید رو همه رو ببرید داخل یک متد مثلا به نام BindProductTable و هر جا که نیاز بود اون متد رو کال کنید که نیاز نباشه کدها رو مدام تکرار کنید که حتما خطا هم بوجود خواهد آمد.
حالا یک بریک پوینت داخل این متد بذارید ببینید که چند بار و کجاها و با چه ترتیبی داره کال میشه.

اون دکمه در واقع توی همون صفحه ی گرید هست و با زدن اون تابع حذف محصولات تیک خورده اجرا میشه، کدهای صفحه هم به شکل زیر هست:


<div dir="rtl">
<asp:Panel ID="Panel1" runat="server" ScrollBars="Auto">
<asp:GridView runat="server" ID="products_table" EnableViewState="true" AutoGenerateColumns="false" AllowPaging="true" OnPageIndexChanging="products_table_indexChanging" style="font-family:Tahoma;font-size:12px;" CellPadding="5" HorizontalAlign="Center" CssClass="gridMain" DataKeyNames="id">
<RowStyle CssClass="gridRow" />
<SelectedRowStyle CssClass="gridSelectedRow" />
<HeaderStyle CssClass="gridHeader" />
<Columns>
<asp:BoundField DataField="id" HeaderText="id" Visible="false" />
<asp:BoundField DataField="name" HeaderText="نام محصول" />
<asp:BoundField DataField="brand" HeaderText="مارک" />
<asp:BoundField DataField="cost" HeaderText="قیمت" />
<asp:BoundField DataField="comments" HeaderText="توضیحات" />
<asp:BoundField DataField="imgName" HeaderText="نام فایل عکس" />
<asp:TemplateField HeaderText="حذف">
<ItemTemplate>
<asp:CheckBox ID="checkRemove" ClientIDMode="Static" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</asp:Panel>
<asp:Button runat="server" ID="remove_product" CssClass="btn" Text="حذف محصولات" OnClick="productrmv" style="margin:5px 23px 0 0;width:600px;height:30px;font-family:Tahoma;font-size:12px;font-weight:bold;margin-top:5px;" />
</div>

mRizvandi
یک شنبه 04 خرداد 1393, 12:33 عصر
باز هم به نظر میاد همه چی سرجاش هست.
به نظرم خصوصیت EnableViewState مربوط به گرید رو فعال کنید. همینطور برای صفحه رو (اگر false شده)
و اینکه برای تمامی متدها و رویدادها بریک پوینت بذارید که بدونید به چه ترتیبی دارن اجرا میشن و کدوم یکی احیانا داره گرید رو خالی می کنه.