PDA

View Full Version : خواندن مقادیر داخل DataList



JikSearch
شنبه 07 آبان 1384, 17:21 عصر
سلام
چطور می توان به یک Item موردنظر از یک DataList دسترسی پیدا کرد؟
مثلاً در کد زیر چطور می توان مقدار دومین فیلد از سطر اول را در یک متغییر رشته ای قرار داد؟



OleDbConnection conn = new OleDbConnection(constr);
OleDbCommand cmd ;
OleDbDataReader dr;
conn.Open();
string query = "SELECT * FROM daily WHERE (([daily]![ID])="+picID+");";
cmd = new OleDbCommand(query, conn);
dr = cmd.ExecuteReader();

DataList1.DataSource=dr;
DataList1.DataBind();

JikSearch
یک شنبه 08 آبان 1384, 18:55 عصر
ببخشید اصلاً می توان همچین کاری کرد؟ هیچ کسی جواب نداده! توی اینترنت هم نبود!!!

Behrouz_Rad
یک شنبه 08 آبان 1384, 23:01 عصر
در هنگام عمل Binding باید از Literal Control یا Label استفاده کنید.


<asp:DataList id="DataList1" runat="server">
<ItemTemplate>
<td><asp:Label ID="myLabel" text='<%# Container.DataItem("myField") %>' Runat=server></asp:Label></td>
</ItemTemplate>
</asp:DataList>

حال باید اندیس ردیفی که قصد خواندن مقادیر آن را ارید مشخص کنید (اندیس از صفر شروع می شود):


DataList1.SelectedIndex = 2

دستور فوق، ردیف سوم را به عنوان ردیف فعال DataList در نظر می گیرد.
حال با یک Type Casting، به راحتی داده ی مورد نظر را بخوانید:


Dim myLabel As Label = CType(DataList1.SelectedItem.FindControl("myLabel"), Label)
Response.Write(myLabel.Text)

موفق باشید.

JikSearch
دوشنبه 09 آبان 1384, 09:37 صبح
آخرشی آقای راد
دمت گرم
من فکر می کردم مانند دیتاگرید می توانیم دسترسی مستقیم داشته باشیم (پس نداریم درسته؟)

Behrouz_Rad
دوشنبه 09 آبان 1384, 10:54 صبح
درسته. دسترسی مستقیم ندارید.

ClaimAlireza
پنج شنبه 11 مرداد 1386, 12:50 عصر
حالا اگه من همین کارو بخام توی gridview انجام بدم و اندیسشو خودش بفهمه چی...
یعنی یه اندیس ایستا تعریف نکنیم.

ببینید مثلا توی رویداد rowUpdating با کد زیر میشه :



((Label)GridView1.Rows[e.RowIndex].FindControl("Label1")).Text


ولی توی رویداد های دیگه نمیتونی از e.rowindex استفاده کنی.

البته باید بگم خیلی چیزای دیگه هم امتحان کردم



protectedvoid GridView1_SelectedIndexChanged(object sender, EventArgs e)
{

int index = GridView1.SelectedIndex;
Label3.Text = ((Label)GridView1.Rows[index].FindControl("Label1")).Text;
}




البته توی رویداد های دیگه هم امتحانش کردم ولی ارور negative index رو میده.

یعنی هیچ مقداری توی index قرار نمیگیره.

وخیلی پستای دیگرو هم خوندم ولی به نتیجه دلخواه نرسیدم.

من میخام وقتی روی یکlinkButton کلیک می کنم مقدار Label1 مربوط به اون سطر رو بدست بیارم .

Behrouz_Rad
پنج شنبه 11 مرداد 1386, 14:50 عصر
شما باید از سلسله مراتب پدر - فرزندی استفاده کنی و sender رو به نوع کنترلی که باعث Fire شدن رویداد شده تبدیل کنی و سپس Parent اش رو به دست بیاری و بعدش با متد FindControl پدر، به راحتی به کنترل مورد نظرت ارجا پیدا کنی.
تاپیک اعمال متداول با GridView رو ببین.

موفق باشید.

ClaimAlireza
جمعه 12 مرداد 1386, 00:44 صبح
جناب راد بنده بارها اونا رو خوندم وبه صورت موردی خیلی استفاده کردم ولی الان نمیدونم کدوم قسمت کد، مورد نظرتون هستش...

اگه استفاده از DirectCast منظورتونه خوشحال میشم بدونم کار این تابع چیه و معادل C# چیه و چجوری کار میکنه.

میشه یه کم موضوع رو بیشتر باز کنید...

Behrouz_Rad
جمعه 12 مرداد 1386, 12:30 عصر
دوست من!
اگر در کدهای اون تاپیک به روال DropDown_SelectedIndexChanged نگاه کنی، متوجه منظور من میشی.
هر Event یک sender داره که مشخص میکنه چه کنترلی باعث فراخوانی اون Event شده.
Event های GridView نیز از این قاعده مستثنا نیستند.
به عنوان مثال در همون رویداد RowUpdating که مثال زدی، میتونی به شکل ذیل نیازت رو پیاده سازی کنی:


Dim myLinkButton As LinkButton = DirectCast(sender, LinkButton)

تو میدونی که اون کنترلی که باعث فراخوانی رویداد RowUpdating میشه، LinkButton هست.
پسsender تو LinkButton میشه.
من این sender رو به نوع Cast، LinkButton کردم.
تا اینجا ارجائی به LinkButton مربوطه پیدا کردم.
حال از سلسله مراتب پدر - فرزندی برای دسترسی به بالاترین رده ای که میتونم از طریق اون به تمامی کنترل های ردیفی که LinkButton مربوطه در اون هست دسترسی پیدا کنم ، استفاده میکنم.
میدونی که اگر به یک ردیف GridView دسترسی داشته باشی، می تونی به تمامی کنترل های موجودر در اون ردیف نیز دسترسی پیدا کنی.
Parent کنترل LinkButon، یک TableCell هست و Parent یک TableCell نیز یک GridViewRow هست.
پس:


Dim Cell As TableCell = DirectCast(myLinkButton.Parent, TableCell)
Dim Item As GridViewRow = DirectCast(Cell.Parent, GridViewRow)

بسیار خوب.
حالا تو به ردیفی که LinkButton مربوطه در اون وجود داره دسترسی داری.
با استفاده از متد FindControl شی Item به راحتی میتونی به Label ات ارجا پیدا کنی و هر کاری که دوست داشتی باهاش انجام بدی!


اگه استفاده از DirectCast منظورتونه خوشحال میشم بدونم کار این تابع چیه و معادل C# چیه و چجوری کار میکنه.

Casting های مختلفی در VB.NET وجود داره که معادلی در #C ندارند!
از جمله TryCast، Cast، DirectCast
از DirectCast زمانی استفاده کن که مطمئنی نوعی که برگشت داده میشه حتما با نوعی که در Casting ذکر میکنی یکی هست.
مثلا در کدهای VB.NET فوق، من اطمینان دارم که کنترلی که باعث Raise شدن رویداد من میشه حتما LinkButton هست. پس اون رو با استفاده از DirectCast تبدیل کردم.

اما اگر نوع برگشتی Casting با نوعی که قرار هست به اون تبدیل بشه یکی نیست، از Cast استفاده کن. به عنوان مثال، اگر تابعی مقدار Int برمیگردونه و تو قصد داری اون رو به Double تبدیل کنی، باید از Cast استفاده کنی.
هر چند که تمامی تبدیل ها میتونن با Cast انجام بشن اما شناخت دقیق نوع تبدیلی و استفاده از تابع مناسب در Performance تاثیر مستقیم خواهد گذاشت.
در #C از سینتکس تبدیل متداول برای تمامی انواع تبدیلی باید استفاده کنی.

موفق باشید.

ClaimAlireza
جمعه 12 مرداد 1386, 17:32 عصر
با تشکر از محبت شما...

مطلب تقریبا برام جا افتاد!!



در #C از سینتکس تبدیل متداول برای تمامی انواع تبدیلی باید استفاده کنی.


متوجه فرمایشتون نمیشم.

من از کدهای زیر استفاده کردم ولی error میده.



LinkButton myLinkButton = Convert.Equals(object sender,object LinkButton);
LinkButton myLinkButton = Convert.Equals(sender, LinkButton);
LinkButton myLinkButton = Convert.ChangeType(sender, LinkButton);

LinkButton myLinkButton = Convert.ReferenceEquals(sender, LinkButton);


ممکنه یه مثال بزنید.

Behrouz_Rad
جمعه 12 مرداد 1386, 23:27 عصر
LinkButton myLinkButton = (LinkButton) sender;


تکمیلی در ادامه ی مبحث Casting پست قبل:
در #C، معادل متد TryCast، کلمه ی کلیدی as هست که مانع از ایجاد خطا در هنگام عمل تبدیل در صورت یکسان نبودن Type ها میشه.

موفق باشید.

ClaimAlireza
شنبه 13 مرداد 1386, 10:34 صبح
جناب راد من از کدهای زیر استفاده کردم ولی خط Bold شده error میده



protectedvoid GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{

LinkButton LinkButton2 = sender asLinkButton;
TableCell cell = (TableCell) LinkButton2.Parent;
//TableCell cell = new TableCell();
//cell =(TableCell) LinkButton2.Parent;
GridViewRow item = cell.Parent asGridViewRow;
Label3.Text = ((Label)item.FindControl("Label1")).Text;
}




Object reference not set to an instance of an object.

Nightbat
شنبه 13 مرداد 1386, 11:08 صبح
جناب راد من از کدهای زیر استفاده کردم ولی خط Bold شده error میده



protectedvoid GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{

LinkButton LinkButton2 = sender asLinkButton;
TableCell cell = (TableCell) LinkButton2.Parent;
//TableCell cell = new TableCell();
//cell =(TableCell) LinkButton2.Parent;
GridViewRow item = cell.Parent asGridViewRow;
Label3.Text = ((Label)item.FindControl("Label1")).Text;
}

در اینطور مواقع استفاده کردن از QuickWatch خیلی چیزها را مشخص می کنه...

ClaimAlireza
شنبه 13 مرداد 1386, 17:03 عصر
در اینطور مواقع استفاده کردن از QuickWatch خیلی چیزها را مشخص می کنه...دوست عزیز میشه یه راهنمایی بکنید.من از طریق QuickWatch چیزی نفهمیدم.!!!کدوم قسمت مورد نظرتونه....
- TableCell System.Web.UI.WebControls.TableCell System.Web.UI.WebControls.TableCell- base System.Web.UI.WebControls.WebControl System.Web.UI.WebControls.WebControl+ base System.Web.UI.Control System.Web.UI.Control+ Non-Public members + TableCell System.Web.UI.WebControls.TableCell System.Web.UI.WebControls.TableCell

Nightbat
شنبه 13 مرداد 1386, 17:21 عصر
ببین دوست من، تو QuickWatch می تونی کدهایی که تو RunTime ایراد می گیره رو تست کنی ببینی ایرادش کجاست و مقادیر رو عوض کنی و همون جا با مقادیر واقعی تست کنی، و مر حله به مرحله جلو بری، مثلا در همین جا می تونی اول LinkButton2.Parent رو تست کنی ببینی چی parentش کیه، بعد Castش کنی ببینی چی میشه، همینطوری هم درست بودن کارت رو مرحله به مرحله چک می کنی، هم با مقادیر واقعی تست می کنی.

ClaimAlireza
یک شنبه 14 مرداد 1386, 09:13 صبح
ببینید دوست عزیز...

من فکر میکنم صورت مسئله پاک شد.

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

با تشکر....

ClaimAlireza
دوشنبه 15 مرداد 1386, 09:43 صبح
دوستان من رو این مسئله کارم خیلی گیره ...

نمیدونم چیکار باید بکنم.

amin-soft
چهارشنبه 18 فروردین 1389, 13:19 عصر
گام اول : Button مورد نظر را CommandArgument را برابر Eval("Idmoredenazarazfilddatabaset")


گام دوم : در قسمت properties برای Button مورد نظر قرار دهید .

CommandName == "addbuyu1" یا هر چیز دلخواه . فقط باید در قسمت گام سوم نام ان را ببرید .

گام سوم : در رویداد ItemCommand دیتالیست کد زیر را وارد کنید .


protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{

if ((e.CommandArgument.ToString() != null) && (e.CommandName == "addbuyu1"))
{
try
{

TextBox tx = (TextBox)(DataList1.Items[e.Item.ItemIndex].FindControl("id textbox morede nazar"));






}
catch (Exception ex)
{
Label.text = ex.Message.ToString();
}
}
}

amin-soft
یک شنبه 29 فروردین 1389, 13:28 عصر
اگه باز مشکلی بود بگو
راه های دیگه هم هست تا به روش دیگه واست کد بزارم یا یک فایل واست ضمیمه کنم .

موفق باشی