PDA

View Full Version : GridView داینامیک



simorgh-hossein
دوشنبه 23 بهمن 1391, 22:10 عصر
سلام دوستان
خسته نباشید !
مدتی هست که دارم رو یه پروژه ای کار میکنم !
یکمی اشکال داشتم و ممنون میشم که کمکم کنید !
تو سایت رجا (خرید بلیط اینترنتی قطار ) اگه به قسمت خرید رفته باشید وقتی تعداد اعضا رو وارد میکنید به تعداد همون اعضا یک GridView ایجاد میکنه که مثلا شامل 2 تا TextBox بصورت نام و نام خانوادگی و کد ملی !
یکی این و دومی اینکه وقتی تو همون قسمت خرید تعداد افراد جانباز رو وارد می کنید به تعداد همون افراد TextBox دیگری ایحاد میکنه !
اگه به شکل زیر نگاه کنید منظورمو بهتر درک میکنید !

http://simorgh-soft.persiangig.com/Barname/raja2.gif

من تو شکل با اطلاعات رو بدین صورت وارد کردم و GridView زیر رو نشونم داد !
http://simorgh-soft.persiangig.com/Barname/raja1.gif
دوستان ممنون میشم منو راهنمایی کنید !

fakhravari
دوشنبه 23 بهمن 1391, 23:34 عصر
با سلام
منم روی همین روش کار میکردم .
میخواستم چنتا گرید سمت کد درست کنم. اما نشد.
توی عکس بالا مطمعا هستید گرید؟

simorgh-hossein
دوشنبه 23 بهمن 1391, 23:50 عصر
آره بنظر میاد که GridView هست ولی مطمئن نیستم !
اگه GridView نیست پس چیه ؟؟؟ :متفکر:

aryadad
دوشنبه 23 بهمن 1391, 23:51 عصر
شما می بایستی در واقع در مرحله اول اطلاعات کاربر را در جایی نگه داشته و در مرحله بعد به صورت ران تایم کد ساخت گرید را به صفحه خود بایند کنید

simorgh-hossein
دوشنبه 23 بهمن 1391, 23:59 عصر
دوست عزیز از اینکه جواب میدین ممنون !
ولی اگه امکانش هست یه نمونه سورس کدی بزارید خیلی خوب میشه !

ghossein
سه شنبه 24 بهمن 1391, 18:16 عصر
simorgh hossein عزیز این یه template سفارشی grid view هست یعنی خودت باید ستونهاشو در ست کنی بعد تو ستونها تکست باکس یا هر چیزی رو اضافه کنی
1 -یه grid view اضافه کن. بعد، از منو کنارش ، ستونهات رو اضافه کن
2 - منوی کنار grid view بزن برو تو قسمت سفارشی کردن grid view اونجا خودت هر چی می خوای اضافه کن

ghossein
سه شنبه 24 بهمن 1391, 18:29 عصر
اگه می خوای دینامیک باشه هنگام مقیدسازی به grid view خودت اونجا می تونی اضافه کنی یا کم کنی تو سایت جستجو کن

simorgh-hossein
سه شنبه 24 بهمن 1391, 18:49 عصر
بخدا خیلی جستجو کردم ولی به نتیجه ای نرسیدم !
ممنون از اینکه بهم کمک می کنید ولی اگه براتون مقدوره یه سورس بذارید بخدا با این حرف ها من قانع نمیشم !
درضمن GridView بصورت داینامیک هست و تو زمان اجرا تعداد TextBox ها فرق میکنه !
خواهشا بهم کمک کنید ! :چشمک:

simorgh-hossein
سه شنبه 24 بهمن 1391, 19:58 عصر
چرا وقتی یه سوالی پرسیده میشه ، جوابش اینه که یا بصورت تئوری جواب میدن یا میگن که برو تو سایت جستجو کن ؟؟؟ :متعجب:
اگه واقعا جوابش تو سایت هست یکی یه لینکی بده ! :متفکر:

raziee
سه شنبه 24 بهمن 1391, 23:24 عصر
بوسیله Template میشه راحت پیاده کرد.
توجه کنید که به تک تک عناصر GridView دسترسی دارید و هر تغییری که بخواهید رو میتونید بهشون بدید.
مثلا رویداد RowCreated همونطور که از نامش پیداست بعد از ایجاد سطر اتفاق میافته و میتونید به اجزاء اون سطر دسترسی داشته باشید

public enum QuotaType
{
Veteran,
Adult,
Child
}
public class DataEntry
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Identity { get; set; }
public string InjuryCode { get; set; }
public decimal Price { get; set; }
public QuotaType Quota { get; set; }

public static IEnumerable<DataEntry> Gets()
{
return new List<DataEntry>
{
new DataEntry { Quota = QuotaType.Veteran, Price = 24500 },
new DataEntry { Quota = QuotaType.Adult, Price = 40500 },
new DataEntry { Quota = QuotaType.Adult, Price = 40500 },
new DataEntry { Quota = QuotaType.Child, Price = 24500 },
};
}
}
protected override void OnInit(EventArgs e)
{
grd.RowCreated += grd_RowCreated;
if (!IsPostBack)
{
DataBind();
}
}
public override void DataBind()
{
grd.DataSource = DataEntry.Gets();
grd.DataBind();

}
void grd_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var o = (DataEntry)e.Row.DataItem;
if (o.Quota != QuotaType.Veteran)
{
e.Row.Cells[3].Controls.Clear();
}
}
if (e.Row.RowType == DataControlRowType.Footer)
{
var litTotal = (Literal)e.Row.FindControl("litTotal");
litTotal.Text = DataEntry.Gets().Sum(x => x.Price).ToString();
}
}

public string GetLocalizeQuotaTitle(QuotaType quota)
{
var o = string.Empty;
switch (quota)
{
case QuotaType.Veteran:
o = "جانباز یا شاهد";
break;
case QuotaType.Adult:
o = "بزرگسال";
break;
case QuotaType.Child:
o = "خردسال";
break;
}
return o;
}

<asp:GridView ID="grd" runat="server" Width="100%" AutoGenerateColumns="false" ShowFooter="true">
<Columns>
<asp:TemplateField HeaderText="عنوان سهمیه">
<ItemTemplate>
<%# this.GetLocalizeQuotaTitle((QuotaType)Eval("Quota")) %>
</ItemTemplate>
<FooterTemplate>
تلفن ضروری:
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="نام">
<ItemTemplate>
<asp:TextBox ID="txtFirstName" runat="server" />
</ItemTemplate>
<FooterTemplate>
<asp:TextBox ID="txtMobile" runat="server" />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="نام خانوادگی">
<ItemTemplate>
<asp:TextBox ID="txtLastName" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="سریال جانبازی">
<ItemTemplate>
<asp:TextBox ID="txtInjuryCode" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="کد ملی">
<ItemTemplate>
<asp:TextBox ID="txtIDentity" runat="server" />
</ItemTemplate>
<FooterTemplate>
جمع کل مبلغ:
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="قیمت">
<ItemTemplate>
<%# Eval("Price") %>
</ItemTemplate>
<FooterTemplate>
<asp:Literal ID="litTotal" runat="server" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

simorgh-hossein
چهارشنبه 25 بهمن 1391, 23:44 عصر
آقای raziee عزیز ممنون از اینکه بهم جواب دادین ! :تشویق:
من از این کدها استفاده کردم و جواب گرفتم ولی اگه بخوام وقتی تعداد جانبازها و بزرگسال ها یا خردسالان رو داخل TextBoxها مشخص کنم و در GridView اعمال بشه ، باید چطوری عمل کنم ؟؟؟ :متفکر:
ممنون میشم بیشتر کمکم کنید ؟؟؟

raziee
پنج شنبه 26 بهمن 1391, 00:33 صبح
آقای raziee عزیز ممنون از اینکه بهم جواب دادین ! :تشویق:
من از این کدها استفاده کردم و جواب گرفتم ولی اگه بخوام وقتی تعداد جانبازها و بزرگسال ها یا خردسالان رو داخل TextBoxها مشخص کنم و در GridView اعمال بشه ، باید چطوری عمل کنم ؟؟؟ :متفکر:
ممنون میشم بیشتر کمکم کنید ؟؟؟

به طور کلی:
کنترل هایی که خاصیت Binding دارند لیستی از اشیاء رو گرفته و به ازاء هر شیء از اون لیست یک خروجی تولید میکنن.
GridView هم مجموعه ای اشیاء رو گرفته (DataSource) و به ازاء هر شیء یک سطر ایجاد میکنه.
بنابراین اگه میخواهید تعداد سطر های GridView رو زیاد کنید باید مجموعه انتساب شده رو تغییر بدید.
به تعداد افراد یک نمونه از یک کلاس ایجاد کنید و به آرایه اضافه کنید.

دوست من سعی کنید کمی مطالعه کنید

raziee
یک شنبه 27 اسفند 1391, 15:55 عصر
کد زیر نام و Type تمام کنترل هاییکه در GridView هستند رو نمایش میده.
grd.Rows.Cast<GridViewRow>().ToList().ForEach(row =>
{
Response.Write("New Row</br>");
row.Cells.Cast<TableCell>().ToList().ForEach(cell =>
{
cell.Controls.Cast<Control>().ToList().ForEach(control =>
{
Response.Write(string.Format("Id = {0} , Type = {1}</br>", control.ID, control.GetType()));
});
});
});
اگه بخواهیم تنها به کنترل های خاصی مثلا Textbox دسترسی داشته باشیم کافیه Control ها رو بر اساس Type فیلتر کنیم.
grd.Rows.Cast<GridViewRow>().ToList().ForEach(row =>
{
Response.Write("New Row</br>");
row.Cells.Cast<TableCell>().ToList().ForEach(cell =>
{
cell.Controls.Cast<Control>()
.Where(c => c.GetType() == typeof(TextBox))
.Select(c => c as TextBox).ToList()
.ForEach(control =>
{
Response.Write(string.Format("Id = {0} , Text = {1}</br>", control.ID, control.Text));
});
});
});
و در نهایت بوسیله ی کدی شبیه به کد زیر میتونید کلاستون رو پر کنید.
توجه داشته باشی که این تنها یک مثال است.
IEnumerable<DataEntry> Fill()
{
var oo = new List<DataEntry>();
grd.Rows.Cast<GridViewRow>().ToList().ForEach(row =>
{
var o = new DataEntry();
row.Cells.Cast<TableCell>().ToList().ForEach(cell =>
{
cell.Controls.Cast<Control>()
.Where(c => c.GetType() == typeof(TextBox))
.Select(c => c as TextBox).ToList()
.ForEach(control =>
{
switch (control.ID.ToLower())
{
case "txtfirstname":
o.FirstName = control.Text;
break;
case "txtlastname":
o.LastName = control.Text;
break;
case "txtinjurycode":
o.InjuryCode = control.Text;
break;
case "txtidentity":
o.Identity = control.Text;
break;
default:
break;
}
});
});

oo.Add(o);
});

return oo;
}

fakhravari
یک شنبه 27 اسفند 1391, 22:57 عصر
با سلام

چرا فقط گرید اخر می اید؟
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = DAL.FillDataTable("SELECT ID, DepartmentName, Description FROM Sync_Department");

System.Web.UI.WebControls.GridView G1 = new System.Web.UI.WebControls.GridView();
System.Web.UI.WebControls.GridView G3 = new System.Web.UI.WebControls.GridView();
System.Web.UI.WebControls.GridView G2 = new System.Web.UI.WebControls.GridView();


G2.DataSource = dt; G2.DataBind();
G3.DataSource = dt; G3.DataBind();

G1 = GridView1;
G1.DataSource = dt; G1.ID = "G1ID"; G1.DataBind();
PlaceHolder1.Controls.Add(G1);


G2 = GridView1;
G2.DataSource = dt; G2.ID = "G2ID"; G2.DataBind();
PlaceHolder2.Controls.Add(G2);


G3 = GridView1;
G3.DataSource = dt; G3.ID = "G3ID"; G3.DataBind();
PlaceHolder3.Controls.Add(G2);

}

fakhravari
سه شنبه 29 اسفند 1391, 23:00 عصر
http://forums.asp.net/p/1891476/5337528.aspx/1?p=True&t=634993058872455754

simorgh-hossein
چهارشنبه 28 فروردین 1392, 08:14 صبح
آقای raziee عزیز ببخشید که هی سوال میپرسم !
بخدا خیلی وقت دنبال این مشکل هستم ولی تا حالا هیچکسی نتونسته بهم کمک کنه ! :افسرده:
اگه بخواییم اطلاعات گریدویو رو داخل جدول درج کنیم باید به چه شکلی عملی کنیم ؟؟؟
آخه هر چی از کد زیر استفاده میکنم ، درست نمیشه !

for (int ii = 1; ii <= grd.Rows.Count; ii++)
{
Label Sahmie = (Label)grd.Rows[rowIndex].Cells[0].FindControl("lblSahmie");
TextBox Fname = (TextBox)grd.Rows[rowIndex].Cells[1].FindControl("txtFname");
TextBox Lname = (TextBox)grd.Rows[rowIndex].Cells[2].FindControl("txtLname");
TextBox Sjanbazi = (TextBox)grd.Rows[rowIndex].Cells[3].FindControl("txtSjanbazi");
TextBox CodeM = (TextBox)grd.Rows[rowIndex].Cells[4].FindControl("txtCodeM");
Label Hazine = (Label)grd.Rows[rowIndex].Cells[5].FindControl("lblHazine");

sc.Add(CodeR.ToString() + "," + Sahmie.Text + "," + Fname.Text + "," + Lname.Text + "," + Sjanbazi.Text
+ "," + CodeM.Text + "," + Hazine.Text + "," + Hazine.Text);
rowIndex++;
}

ممنون میشم کمکم کنید !

raziee
چهارشنبه 28 فروردین 1392, 10:26 صبح
@simorgh-hossein:
نحوه ی ذخیره سازی اطلاعات در دیتابیس ارتباطی به گرفتن اطلاعات از GridView نداره.
اگه مشکلی در ذخیره سازی دارید در تاپیک جداگانه ای مطرح کنید ارتباطی با موضوع این تاپیک نداره.

اما در آخر:
این شیوه کد نویسی اشتباه است.
بخش های مختلف رو از هم جدا کنید. این کار هم باعث خوانایی کد ها میشه ، هم اگه مشکلی در قسمتی باشه راحت تر پیدا میشه هم ....
به طور مثلا:
متد ذخیره کردن در بانک نباید در متد گرفتن اطلاعات از گرید باشه. بهتره اول اطلاعات رو از گرید بگیرید بعد به یک کلاس ببرید و اون کلاس رو به تابع ذخیر کردن ارسال کنید.
وحید نصیری مطالبی رو تحت عنوان "آشنایی با Refactoring (http://www.dotnettips.info/post/650/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-refactoring-%D9%82%D8%B3%D9%85%D8%AA-1)" نوشتن. مطالعه کنید براتون بسیار مفید خواهد بود

simorgh-hossein
چهارشنبه 28 فروردین 1392, 14:21 عصر
آقای raziee ممنون از اینکه پاسخ میدین !
نحوه ذخیره سازی داده ها درون دیتابیس رو بلدم و همین سایت خوب برنامه نویس یاد گرفتم !
آخه بدون گرفتن اطلاعات از گرید مگه میشه داده ای تو دیتابیس ذخیره کرد ؟؟؟
مشکل من در گرفتن اطلاعات از همین گریدویو هست !
وقتی گرید رو پر میکنم و روی دکمه Insert کلیک میکنم خطا میده !
اصلاً کنترل هایی که در Template گریدویو اضافه کردمو نمیشناسه !
اگه تو این مورد کمکم کنید ممنون میشم ! :قلب:

simorgh-hossein
شنبه 31 فروردین 1392, 00:49 صبح
دوستان همونطور که گفتم تنها مشکل من گرفتن اطلاعات از همین گریدویو هست و نحوه ذخیره سازی اطلاعات داخل دیتابیس رو بلدم !
بخدا بدجوری گیر کردم !
اگه به تاریخ این تاپیک توجه کنید ، میفهمید که حدود 4 ماهه که درگیر همین مشکل هستم و از همه کس راهنمایی خواستم ولی کسی درستو حسابی بهم کمک نکرده !
فقط تنها کسی که تو این تاپیک شرکت کرده آقای raziee هستن !
چهارشنبه همین هفته قراره که پروژمو تحویل بدم !
اگه تو این مورد بنده رو راهنمایی بفرمائید ممنون میشم !

raziee
شنبه 31 فروردین 1392, 01:33 صبح
آخه بدون گرفتن اطلاعات از گرید مگه میشه داده ای تو دیتابیس ذخیره کرد ؟؟؟
عرض بنده این بود که شما باید تابعی بنویسید (با نام فرضی GetListFromGridView) که لیستی از یک کلاس رو برگردونه. وظیفه این تابع گرفتن اطلاعات وارد شده توسط کاربر هست. بعد از آزمایش صحت کارکرد این تابع دیگه ای رو برای ثبت اطلاعات (همون لیستی که از تابع GetListFromGridView بدست میاد) رو بنویسید.

وقتی گرید رو پر میکنم و روی دکمه Insert کلیک میکنم خطا میده !
متن خطا رو ذکر کنید.

simorgh-hossein
شنبه 31 فروردین 1392, 19:12 عصر
آفای raziee ممنون از اینکه جواب میدین !
من از همون کدهایی که تو پست 16 گفتم ، استفاده میکنم ولی خطای زیر رو میده !

Object reference not set to an instance of an object

بخدا دیگه نمیدونم از چه روشی استفاده کنم !!! :ناراحت:

آیا نجوه گرفتن من غلط هست ؟
ممنون میشم در مورد نوشتن این تابع بهم کمک کنید !

raziee
شنبه 31 فروردین 1392, 23:46 عصر
پروژه رو خط به خط اجرا کنید.
بر روی اولین خط تابه یک Break Point بگذارید(بوسیله F9) و پروژه رو اجرا کنید به این خط دستور که برسه وارد پروژه میشید و میتونید خط به خط کد ها رو اجرا کنید و ببینید که کدوم دستور خطا تولید میکنه.

برای گرفتن سریع تر پاسختون در صورت امکان بخش مربوطه رو ضمیمه کنید و در غیر این صورت کدهاتون رو اینجا قرار بدید.

و یا یک لاگ تهیه کنید به طور مثال:
for (int index = 0; index < grd.Rows.Count; index++)
{
Label sahmie = (Label)grd.Rows[index].Cells[0].FindControl("lblSahmie");
TextBox fName = (TextBox)grd.Rows[index].Cells[1].FindControl("txtFname");
TextBox lName = (TextBox)grd.Rows[index].Cells[2].FindControl("txtLname");
TextBox sJanbazi = (TextBox)grd.Rows[index].Cells[3].FindControl("txtSjanbazi");
TextBox codeM = (TextBox)grd.Rows[index].Cells[4].FindControl("txtCodeM");
Label hazine = (Label)grd.Rows[index].Cells[5].FindControl("lblHazine");


CheckNull(sahmie, index, "lblSahmie");
CheckNull(fName, index, "txtFname");
CheckNull(lName, index, "txtLname");
CheckNull(sJanbazi, index, "txtCodeM");
CheckNull(codeM, index, "txtCodeM");
CheckNull(hazine, index, "lblHazine");
}

void CheckNull(object @object, int index, string name)
{
if (@object == null)
{
// log
Response.Write(string.Format("{0} is null in row {1}.", name, index));
}
}


پ.ن:
نام گذاری متغییر ها غیر اصولی است در مورد Camel Case و Pascal Case تحقیق کنید. لینک (http://www.dofactory.com/topic/1141/camelcase-pascalcase-vs-camelcase-pascalcase.aspx)- لینک (http://cplus.about.com/od/learnc/ss/csharpclasses_5.htm)

simorgh-hossein
یک شنبه 01 اردیبهشت 1392, 09:41 صبح
آقای raziee اینم نمونه کد برنامه !
شروع پروژه از صفحه Default2.aspx هست !
راستی از متد CheckNull شما هم استفاده کردم و اطلاعات درج میشه !
تنها مشکلی هست مقادیر Null یا خالی ثبت میکنه !
ممنون میشم بهش یه نگاهی بکنید و مشکلش رو حل کنید !
بخدا کارم بدجوری گیره !

http://simorgh-soft.persiangig.com/Simorgh-Bime/Example.zip

raziee
یک شنبه 01 اردیبهشت 1392, 11:28 صبح
@simorgh-hossein:
از زمان درخواست صفحه به سرور تا پایان پردازش اون صفحه یکسری رویداد اجرا میشن که بخشون میگن "چرخه حیات صفحه" ، ASP.NET Page Life Cycle Overview (http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx). لینک رو حتما مطالعه کنید.

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

public override void DataBind()
{
if (!IsPostBack)
{
// your code
}
}

simorgh-hossein
یک شنبه 01 اردیبهشت 1392, 14:59 عصر
آقای raziee
ممنون کار کرد :قلب: ولی مشکلش اینه که فقط سطر اول گرید رو درج میکنه و بقیه سطرها رو تکراری میزنه یعنی مثلا اگه 3 تا سطر تو گرید داشته باشیم مقادیر سطر اول رو 3بار تکرار کرده و داخل دیتابیس درج میکنه !
به نظرتون مشکل از کجاست ؟؟؟ :متفکر:

raziee
یک شنبه 01 اردیبهشت 1392, 21:18 عصر
به نظرتون مشکل از کجاست ؟؟؟
برادر کمی فکر کنید. کد هاتون رو نگاه کنید. بررسی کنید.

ایندکس در کد شما ثابت هست. به خاطر همین همیشه اطلاعات سطر اول رو دریافت میکنه

simorgh-hossein
یک شنبه 01 اردیبهشت 1392, 23:50 عصر
آقای raziee مگه حلقه For بدون گام (همون ++ یا -- ) میتونه بره جلو ؟
من حتی این حلقه رو با ForEach هم امتحان کردم ولی باز همون مقدار سطر اول درج میشه !
اندکس رو هم بررسی کردم و در هر مرحله یکی بهش اضافه میشه !
حالا نمیدونم دیگه مشکل از کجاست ؟؟؟ :متفکر:

simorgh-hossein
یک شنبه 01 اردیبهشت 1392, 23:58 عصر
آقای raziee میخوام یه چیزی بگم !
بگم ؟
میخوام بگه در حق من برادری رو تموم کردین !
میخوام از همین جا روتون رو ببوسم ! :بوس:
میخوام بگم ای ولا !
خیلی مردی به مولا !
بخدا خیلی گلی !
همین که تا حالا بهم کمک کردی یه دنیا می ارزه ! :لبخندساده:
ای کاش ارومیه بودی تا هرکاری از دستم بربیاد بهت میکردم ! :لبخندساده:
مشکلم حل شد ! :لبخند:
واقعا ممنون ! :لبخند:
راستی اگه هرکاری داشتی (که بتونم انجام بدم ) دربست درخدمتم !