PDA

View Full Version : سوال: بایند کردن دستی



بمب منطقی
دوشنبه 11 مرداد 1389, 22:37 عصر
با سلام:

این سناریو رو در نظر بگیربن:
یک gridview داریم که به هیچ sqldatasource ای وصل نیست.و در داخل templatefield کنترل های مورد نظرمون رو ساختیم و آماده قرار دادیم.
در قسمت code behind جدول مورد نظرمون رو از دیتابیس خوانده و در یک dataset میریزیم.
*حالا میخوایم فیلدهای دلخواهمون رو از dataset انتخاب کرده و در کنترلهای داخل tamplatefield قرار دهیم.
و در آخر gridview رو بایند کنیم.

نکته:علت انجام تمام این کارها و لقمه پیچاندن ها اینه که admin سایت میتونه جداول مورد نظرش رو در run time به دیتابیس اضافه و از اون کم کنه.و گرید ویوی مذکور هم طوری طراحی شده که هرکدوم از جداول رو که کاربر سایت خواست ،بتونه نمایش بده.

حالا سوال:
چطور میتونم به کنترلهای مذکور دسترسی از نوع نوشتن داشته باشم.(یعنی کاری که در سطر ستاره دار(*) در متن بالا صورت میگیره)

با تشکر

Ali_M.Eghbaldar
سه شنبه 12 مرداد 1389, 02:27 صبح
سوالت خیلی ناواضح بود :افسرده:

بمب منطقی
سه شنبه 12 مرداد 1389, 03:49 صبح
کجاش نا واضح بود بگین تا توضیح بیشتری بدم؟

imanasp
سه شنبه 12 مرداد 1389, 09:24 صبح
حالا سوال:
چطور میتونم به کنترلهای مذکور دسترسی از نوع نوشتن داشته باشم.(یعنی کاری که در سطر ستاره دار(*) در متن بالا صورت میگیره)



اگه منظورت تغییر مقدار templateField های گریدویو هستش میتونی به جای استفاده از متد Eval برای بایند کردن از متد Bind استفاده کنی

Ali_M.Eghbaldar
سه شنبه 12 مرداد 1389, 10:06 صبح
با سلام:

حالا سوال:
چطور میتونم به کنترلهای مذکور دسترسی از نوع نوشتن داشته باشم.(یعنی کاری که در سطر ستاره دار(*) در متن بالا صورت میگیره)

با تشکر

؟؟؟؟؟؟؟؟؟؟

بمب منطقی
سه شنبه 12 مرداد 1389, 13:21 عصر
؟؟؟؟؟؟؟؟؟؟

وقتی در templatefield کنترل هایی رو قرار میدیم،در designview یه sqldatasource قرار میدیم و sqldatasource مون رو به جدول مورد نظرمون وصل میکنیم.و به راحتی بر روی هر کنترل داخل templatefield کلیک راست کرده و بر روی Edit DataBindings کلیک میکنیم و به هر کدوم از فیلدهای جدول انتخابیمون،که در نظر داریم،bind اش میکنیم.
این در زمانی درسته که جدول رو بطور استاتیک در sqlDataSource مشخص کنیم.حالا اگه فیلدهای جدولمون رو بخوایم در RunTime (در codebehind و به صورت دستی،از طریق کدنویسی) به کنترل های templatefield بایند کنیم باید چطور عمل کنیم؟

توضیح بیشتر:
در هر جدولی که توسط admin در runTime ساخته میشه و به بانک اضافه میشه،فیلدهای زیر بطور ثابت وجود دارند که برای هر کدام از آنها در templatefield یک کنترل label وجود داره تا مقادیر این فیلدها به این کنترل ها بایند بشه.
model,code,warranty,comment,price,sell

admin میتونه فیلدهای دیگه ای (علاوه بر این فیلدهای ثابت) رو به جدول مورد نظرش اضافه کنه که برای این فیلدهای اضافی در templatefield یک listBox قرار داده شده تا مقادیر این فیلدهای اضافی به این listbox اضافه بشه.

admin هر کدام ایز این جداول رو که دلش میخواد باید بتونه به این gridview وصل کنه.

نکته: من این همه کار رو ازتون نمی خوام :بامزه: فقط می خوام بدونم چطور تو codebehind بطور دستی کنترل ها رو به فیلدهای جدول مورد نظرم بایند کنم (توضیح کامل در خطوط بالا :لبخندساده: )

imanasp
سه شنبه 12 مرداد 1389, 14:11 عصر
if (!Page.IsPostBack)
{

bindNewSubject();



public void bindNewSubject()
{
DataSet ds = new DataSet();
SqlDataAdapter dar = new SqlDataAdapter();
dar.SelectCommand = new SqlCommand();
dar.SelectCommand.Connection = cnn;
dar.SelectCommand.CommandText = "SELECT TOP (4) cName FROM vw_NewSubject ORDER BY scId DESC";
dar.FillSchema(ds, SchemaType.Source, "vw_NewSubject");
dar.Fill(ds, "vw_NewSubject");
grwNewSubject.DataSource = ds;
grwNewSubject.DataMember = "vw_NewSubject";
grwNewSubject.DataBind();
}

بمب منطقی
سه شنبه 12 مرداد 1389, 21:03 عصر
if (!Page.IsPostBack)
{

bindNewSubject();



public void bindNewSubject()
{
DataSet ds = new DataSet();
SqlDataAdapter dar = new SqlDataAdapter();
dar.SelectCommand = new SqlCommand();
dar.SelectCommand.Connection = cnn;
[dar.SelectCommand.CommandText = "SELECT TOP (4) cName FROM vw_NewSubject ORDER BY scId DESC";]
dar.FillSchema(ds, SchemaType.Source, "vw_NewSubject");
***dar.Fill(ds, "vw_NewSubject")
grwNewSubject.DataSource = ds;
grwNewSubject.DataMember = "vw_NewSubject";
grwNewSubject.DataBind();
}

نه متاسفانه به این سادگی ها نیست.این چیزی که شما نوشتین زمانی که از templatefield استفاده نمیشه جواب میده نه زمانی که از اون استفاده میکنیم!
تا خطی که با *** نشون دادم کد درسته.از اونجا به بعد باید هر فیلد دلخواهم از ds رو به هر کنترل داخل templatefield ام بتونم بایند کنم.ولی چطور؟

مثلا از *** به بعد باید بتونم چیزی مثل شبه کد زیر بنویسم.(فرض کنید ds چهارتا فیلد داره و کنترلهای داخل templatefield چهارتا label هستن):


grwNewSubject.itemtemplate.label1.datasource=ds
grwNewSubject.itemtemplate.label1.datamember="field1"

grwNewSubject.itemtemplate.label2.datasource=ds
grwNewSubject.itemtemplate.label2.datamember="field2"

grwNewSubject.itemtemplate.label3.datasource=ds
grwNewSubject.itemtemplate.label3.datamember="field3"

grwNewSubject.itemtemplate.label4.datasource=ds
grwNewSubject.itemtemplate.label4.datamember="field4"

imanasp
چهارشنبه 13 مرداد 1389, 16:50 عصر
نه متاسفانه به این سادگی ها نیست.این چیزی که شما نوشتین زمانی که از templatefield استفاده نمیشه جواب میده نه زمانی که از اون استفاده میکنیم!


عزیز دل برادر این کدی که گذاشتم مربوط به بایند شدن گریدویویی هستش که بدون استفاده از SqlDataSource و به صورت ItemTemplate به فیلدهای دیتابیس بایند میشه


مثلا از *** به بعد باید بتونم چیزی مثل شبه کد زیر بنویسم.(فرض کنید ds چهارتا فیلد داره و کنترلهای داخل templatefield چهارتا label هستن):نیازی به چنین کاری نیست مثلا Label12 (مثال خودت) رو در داخل قسمت ItemTemplate بایند می کنی به نام فیلدی از بانک که میخای نمایش بدی:(توی این مثال اسم فیلد بانک cName هستش)


<ItemTemplate>
<asp:Label ID="Label12" runat="server" Text='<%# Eval("cName") %>'></asp:Label>
</ItemTemplate> من توی کدی که گذاشتم یک سلکت روی Viewای که از قبل ساختم زدم و فقط گریدویو رو به ds انتساب دادم کار خیلی سادست انجام بده می بینی

بمب منطقی
پنج شنبه 14 مرداد 1389, 02:20 صبح
ایول خدا بر شما. :بامزه: مشکلم رو حل کردین.باید از custom binding استفاده میکردم. دررابطه با یه مشکل دیگمم از کدتون ایده گرفتمو کارم راه افتاد.
واقعا ممنونم :تشویق: :تشویق: