PDA

View Full Version : سفارشی گرید ویو با کد نویسی



angel farahani
شنبه 16 فروردین 1393, 23:07 عصر
سلام ، دوستان من خروجی یک جستجو را که با کدنویسی نوشته شده رو در گرید نشون میدم ، حالا میخوام گرید ویو رو سفارشی کنم ، مثلا paging آن را فعال کردم ، اما وقتی میرم صفحه دوم خطای The GridView 'ResultGrid' fired event PageIndexChanging which wasn't handled. رو میده یا اینکه به صفحه دیگه نمیره و فقط در page اول می مونه . و اینکه چطور اسم فیلد ها رو که در header اومده تغییر بدم ، در حالت عادی با edit field می دونم اما زمانیکه فقط خروجی کد رو نشون میده چطوری هست ؟

و سوال آخر اینکه چطور میتونم قابلیت حذف و ویرایش رو در این حالت اضافه کنم . دوستان لطفا این قابلیت ها رو در حالت عادی که همه می دونیم :) اشاره نکنید . با سپاس از این انجمن خوب

mRizvandi
یک شنبه 17 فروردین 1393, 01:23 صبح
1- وقتی خودتون گرید رو بایند می کنید، باید خیلی از عملیاتهای گرید رو خودتون پیاده سازی کنید، مثل همین Paging
ابتدا رویدا Page Index Change رو اضافه کنید. سپس داخل اون دوباره گرید رو بایند کنید.


رو میده یا اینکه به صفحه دیگه نمیره و فقط در page اول می مونه . و اینکه چطور اسم فیلد ها رو که در header اومده تغییر بدم
منظورتون رو متوجه نمیشم، شما با HeaderText می تونید عناوین هدر رو برای هر ستون تعریف کنید.


در حالت عادی با edit field می دونم اما زمانیکه فقط خروجی کد رو نشون میده چطوری هست ؟

این رو هم متوجه نشدم

قابلیت حذف و ویرایش هم کاری نداره، مثل حالت عادی هست، با این تفاوت که باید خودتون همه چی رو هندل کنید، سناریتون رو باز کنید تا بهتر بشه موضوع رو درک کرد و راه حل داد.

bbagher
یک شنبه 17 فروردین 1393, 09:56 صبح
تغییر نام هدر

dataGridView1.Columns[0].HeaderText = "نام";
dataGridView1.Columns[1].HeaderText = "نام خانوادگی";


تغییر فونت و ...

dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("B Nazanin", 10, FontStyle.Bold);
dataGridView1.DefaultCellStyle.Font = new Font("B Nazanin", 10, FontStyle.Bold);
dataGridView1.Rows[0].Cells[0].Style.Font = new Font("B Nazanin", 10, FontStyle.Italic);

angel farahani
پنج شنبه 21 فروردین 1393, 00:13 صبح
سپاس از دوستان ، میخوام با استفاده از کد در رویداد rowdeleting و rowupdating کد حذف و ویرایش رو بنویسم ، در این مورد راهنماییم کنید لطفا

mRizvandi
پنج شنبه 21 فروردین 1393, 00:29 صبح
سپاس از دوستان ، میخوام با استفاده از کد در رویداد rowdeleting و rowupdating کد حذف و ویرایش رو بنویسم ، در این مورد راهنماییم کنید لطفا
دیتا سورسی که استفاده می کنید چی هست؟ کلاسی است که خودتون نوشتید؟

angel farahani
پنج شنبه 21 فروردین 1393, 00:36 صبح
خودم یک متد به اسم ()griddat نوشتم و به پایگاه وصل شدم و پارامترهای جستجو رو گذاشتم ، حالا روی خروچی آن جستجو در گرید میخوام ویرایش و حذف داشته باشم . البته سرچ ام هم درست پیدا نمی کنه
:(

mRizvandi
پنج شنبه 21 فروردین 1393, 01:17 صبح
من اول سناریوی انجام کار رو خدمتتون عرض می کنم:
وقتی گرید رو بایند می کنید، باید فیلد کلید اصلی جدولتون رو در خصوصیت DataKeyNames قرار بدید. (اگر چند تا هستند همه رو با کاما از هم جدا کنید)
با این کار وقتی کاربر ردیفی رو ویرایش یا حذف می کنه شما می دونید که کدام رکورددیتابیس رو باید ویرایش یا حذف کنید.
دو ستون حذف و ویرایش هم به گرید اضافه میکنید. این دو ستون از نوع CommandField هستند و یکی خصوصیت ShowEditButton با مقدار true داره و یکی هم خصوصیت ShowDeleteCommand با مقدار true. بقیه خصوصیات مورد نظرتون رو هم مقداردهی کنید.
حالا رویدادهای زیر رو به گرید ویو اضافه کنید:
RowEditing - برای زمانی که وارد حالت ویرایش می شوید.
RowCancelingEdit - برای زمانی که کاربر از یک ویرایش انصراف می دهد. (میتونه هیچ کدی نداشته باشه، ولی باید وجود داشته باشه)
RowUpdating - برای زمانی که می خواهید یک رکورد رو در بانک آپدیت کنید.
RowDeleting - و برای زمانی که می خواهید حذف کنید.
برای ستونهایی که می خواهید قابلیت ویرایش داشته باشند از TemplateField استفاده کنید و حتما EditTemplateField رو برای اونها تعریف کنید. برای بقیه که نمی خواهید ویرایش شوند فقط ItemTemplate رو مشخص کنید.

حالا همه چی برای کد نویسی آماده است.
کاربر دکمه حذف رو میزنه، شما در رویداد RowDeleting میتونید متوجه بشید که کاربر چه دستوری داده. آی دی ردیف جاری رو با استفاده از DataKeyNames بدست می آورید و با یک کوئری، استورپروسیجر یا هر روش دیگه ای که برای ارتباط با بانک استفاده می کنید، رکورد رو حذف کنید. (به مثال زیر توجه کنید)


protected void GridViewName_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int recordId = Convert.ToInt32(e.Keys["PrimaryKeyName"]);
MyClass.DeleteRecordByRecordId(recordId);
BindGridViewName();
}


خب حالا باید مثل همین روش رو برای ویرایش هم دنبال کنید:
ابتدا باید در رویداد RowEditing شماره اندیس ردیف گریدویو رو برای تغییر به حالت ویرایش تعیین کنید:

protected void GridViewName_RowEditing(object sender, GridViewEditEventArgs e)
{
gGridViewNameEditIndex = e.NewEditIndex;
BindHGridViewName();
}

با این کار گرید میفهمه که کدوم ردیف رو باید به وضعیت ویرایش ببره.
حالا ممکنه کاربر اطلاعات رو ویرایش کنه یا انصراف بده و دکمه انصراف رو بزنه.
اول انصراف که ساده تر هست:

protected void GridViewName_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridViewName.EditIndex = -1;
BindGridViewName();
}
خب آخرین مرحله و ثبت اطلاعاتی که کاربر ویرایش کرده:
ابتدا با استفاده از خصوصیت DataKeys مقدار آی دی رکورد رو بدست بیارید، سپس دستور آپدیت رکورد مورد نظر رو با مقادیر جدید بدید. من یک مثال براتون میذارم که البته باید با نوع پروژه خودتون سبکش رو تغییر بدید:


protected void GridViewName_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

int recordId = Convert.ToInt32(GridViewName.DataKeys[e.RowIndex].Value);
ClassItem item = new ClassItem(recordId);
int newNumber = Convert.ToInt32(((TextBox)GridViewName.Rows[e.RowIndex].FindControl("Number")).Text);
item.Number = newNumber;
ClassLogic.UpdateItem(item);

GridViewName.EditIndex = -1;
BindGridViewName();
}

angel farahani
جمعه 22 فروردین 1393, 10:39 صبح
مرسی که جواب دادین ، template field رو چطوری اضافه کنم ؟ از همون پنجره هوشمند گرید اضافه کنم و مربوط به اون فیلد مشخص کنم ؟؟؟

mRizvandi
جمعه 22 فروردین 1393, 11:17 صبح
مرسی که جواب دادین ، template field رو چطوری اضافه کنم ؟ از همون پنجره هوشمند گرید اضافه کنم و مربوط به اون فیلد مشخص کنم ؟؟؟

یا اینکه سورس صفحه رو بیارید و در بخش Columns اینطوری یک ستون رو تعریف کنید (به مثال زیر دقت کنید. می تونید از کنترلهای اعتبارسنجی یا هر چیز دیگه ای که نیاز دارید استفاده کنید.)

<asp:TemplateField HeaderText="تعداد نفرات" ItemStyle-Width="80">
<ItemTemplate>
<asp:Literal ID="literalName" runat="server" Text='<%# Eval("FieldName") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtFieldName" runat="server" MaxLength="3" Width="50" Text='<%# Bind("FieldName") %>' ClientIDMode="Static" />
<asp:RequiredFieldValidator ID="rfvFieldName" runat="server" ControlToValidate="txtFieldName" ValidationGroup="Validation" />
</EditItemTemplate>
</asp:TemplateField>

angel farahani
جمعه 22 فروردین 1393, 15:57 عصر
پس باید گرید رو از حالت Auto generate filed در بیاورم ؟
private void GridData() {
String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);
SqlCommand sqlcmd;
SqlDataAdapter da;
DataTable dt = new DataTable();
String query;

if ((EmailTxt.Text == "") | (CellphoneTxt.Text == "") & (user.Checked)|(shopadmin.Checked)==false)
query = "select * from users";
else if ((EmailTxt.Text != "") | (CellphoneTxt.Text != ""))
query = "select * from users where (cellphone=@cellphone)OR(email=@email)";
else
query = "select * from users where (cellphone=@cellphone)OR(email=@email)OR(usertypei d=1)OR(usertypeid=2)";



if(user.Checked)
query = "select * from users where (usertypeid=1)";

else if(shopadmin.Checked)
query = "select * from users where (usertypeid=2)";
else
query = "select * from users";



sqlcmd = new SqlCommand(query, sqlcon);
sqlcmd.Parameters.AddWithValue("@cellphone", CellphoneTxt.Text);
sqlcmd.Parameters.AddWithValue("@email", EmailTxt.Text);
sqlcon.Open();
da = new SqlDataAdapter(sqlcmd);
dt.Clear();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
UserGrid.DataSource = dt;
UserGrid.DataBind();
}
else
{
UserGrid.DataBind();
NotFoundMsg.Visible = true;
}
sqlcon.Close();
}




کدهای من همین هاست ، این کدی که مربوط به رویداد حذف که فرمودید
MyClass.DeleteRecordByRecordId(recordId); رو چطور بنویسم ؟ ایراد میگیره که ازش

angel farahani
جمعه 22 فروردین 1393, 16:30 عصر
من حذف کردنم درست شد ، منتها یه چیزی userid فردی که میخوام حذف کنم در جدول سفارش کلید خارجی هست ، برا همین اگه بخوام حذف کنم ، خطا می گیره

این کد حذفم ، باید کوئری ام رو چطوری بنویسم که درسته شه ؟




String conString = ConfigurationManager.ConnectionStrings["OnlineResturansConnectionString"].ToString();
SqlConnection sqlcon = new SqlConnection(conString);
int userid = Convert.ToInt32(e.Keys["userid"]);
sqlcon.Open();
SqlCommand cmd = new SqlCommand("delete from users where userid=" + userid,sqlcon);
cmd.ExecuteNonQuery();
sqlcon.Close();
GridData();

mRizvandi
جمعه 22 فروردین 1393, 22:41 عصر
در خصوص حذف کردن دو راه دارید:
روش اول اینه که وقتی می خواهید رکوردی رو پاک کنید، اول رکورد رو از جدول دوم پاک کنید و سپس رکورد رو از جدول اصلی پاک کنید.
راه دیگه که اصولی است بر اساس تنظیماتی است که شما در SQL Server تعیین می کنید: به این راهنما مراجعه کنید:
http://www.mssqltips.com/sqlservertip/2365/sql-server-foreign-key-update-and-delete-rules/