ورود

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



ali.monje
پنج شنبه 14 فروردین 1393, 19:06 عصر
سلام خدمت همه دوستان عزیز
ببخشید یه مشکل برام پیش اومده اونم اینکه:
میخوام به کنترل Label که داخل یک ListView وجود داره دسترسی پیدا کنم و مقدار Text اون رو تو یه متغییر ذخیره کنم! ( زبان استفاده شده : سی شارپ )
به نظرتون کلا میشه چنین کاری کرد؟
از دوستان اگه کسی راه حلی بلده لطفا درج کنه که بینهایت سپاس گذارم :لبخندساده:

اینم نمونه کدی که دارم روش کار میکنم :

<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1" EnableModelValidation="True">
<ItemTemplate>
<li>
<asp:Label ID="contLabel" runat="server" Text='<%# Eval("cont") %>' />
<asp:Label ID="description_contLabel" runat="server" Text='<%# Eval("description_cont") %>' />
<asp:Label ID="keywordsLabel" runat="server" Text='<%# Eval("keywords") %>' />
</li>
</ItemTemplate>
</asp:ListView>

mRizvandi
پنج شنبه 14 فروردین 1393, 22:44 عصر
برای دسترسی به اشیای داخل هر کانتینری، می تونید از متد FindControl اون کانتینر استفاده کنید، برای مثال:


((Label)ListView1.FindControl("contLabel")).Text = "Hello World!";

ali.monje
جمعه 15 فروردین 1393, 00:08 صبح
برای دسترسی به اشیای داخل هر کانتینری، می تونید از متد FindControl اون کانتینر استفاده کنید، برای مثال:


((Label)ListView1.FindControl("contLabel")).Text = "Hello World!";

خیلی ممنون دوست عزیز:لبخندساده: , این کد تا جایی که من میدونم تو سی شارپ قابل استفاده نیست چون اصلا خصوصیتی به عنوان .Text بعد از انتخاب FindControl وجود نداره.
خودم تونستم تا این کد پیش برم
که میشد باهاش مقدار رو بردارم و تو متغییر ذخیره کنم و بعد متغییر رو دوباره با تغییراتی که بهش دادم برگردونم به کد , ولی مشکل اینجاست بعد اینکه پروزه رو بستم و دوباره بازش کردم عمل نمیکنه دیگه
اینم کد :

protected void List_load(object sender, EventArgs e)
{
foreach (ListViewItem item in ListView1.Items)
{
Label mylabel = (Label)item.FindControl("contLabel");
cont_text = mylabel.Text;
cont_text = cont_text.Substring(0, 160);
mylabel.Text = cont_text;
}
}

این رو یه تایع تعریف کردم که موقع لود شدن اون لیبل با دستور Onload فراخوانیش میکنم. که نمیدونم چرا اول درست کار کرد بعد اینکه پروزه رو بستم و باز کردم کار نکرد دیگه یعنی اصلا وارد حلقه foreach نمیشه. :متفکر:
و هم اینکه این کد یه مشکل دیگه هم داشت اونم اینکه مثلا من مشخصات 10 تا پست رو آورده بودم رو صفحه بعد فراخوانی این کد محتوای همشون یکی میشد( قراره یه مقدار رو از دیتابیس بخونم یعنی رشته رو بعد مثلا 160 کاراکترشو نشون بدم بقیشم با کلیک رو دکمه متن کامل تو یه صفحه دیگه )

از دوستان باز کسی چیزی میدونه شدید مشتاق شنیدنم.
ممنون از الطاف بی پایان :چشمک:

mRizvandi
جمعه 15 فروردین 1393, 10:54 صبح
خیلی ممنون دوست عزیز:لبخندساده: , این کد تا جایی که من میدونم تو سی شارپ قابل استفاده نیست چون اصلا خصوصیتی به عنوان .Text بعد از انتخاب FindControl وجود نداره.

بله دوست عزیز حق با شماست در سی شارپ متد FindControl خصوصیتی به نام Text نداره. اما اگر به کدی که داده بودم دقتی می کردید، متوجه می شدید که من اون رو Cast کردم به یک Label در نتیجه اون کد صحیح هست. :چشمک:

کدی که خودتون نوشتید هم صحیح هست.
اما فکر می کنم از Event مناسبی استفاده نکردید. پیشنهاد می کنم، از رویداد ItemDataBound استفاده کنید، در این حالت دیگه نیازی نیست بعد از پر شدن لیست ویو دوباره روی اون حلقه بزنید و هر زمان که لیست بایند بشه تک تک رکوردهاش رو می تونید تغییر بدید.

mRizvandi
جمعه 15 فروردین 1393, 11:13 صبح
این هم یک کد نمونه که باید اون رو داخل رویداد ItemDataBound قرار بدید:
(حتما در زمان برش زدن چک کنید که متن طولانی تر از میزانی باشه که شما نیاز دارید، در غیر اینصورت ممکنه با یک تیتر کوتاه کدتون به خطا بره)


if (e.Item.ItemType == ListViewItemType.DataItem)
{
Label titleLabel = (Label)e.Item.FindControl("lblTitle");
if (titleLabel.Text.Length > 64)
titleLabel.Text = titleLabel.Text.Substring(0, 64) + "...";
}

ali.monje
یک شنبه 17 فروردین 1393, 18:33 عصر
بله دوست عزیز حق با شماست در سی شارپ متد FindControl خصوصیتی به نام Text نداره. اما اگر به کدی که داده بودم دقتی می کردید، متوجه می شدید که من اون رو Cast کردم به یک Label در نتیجه اون کد صحیح هست. :چشمک:

کدی که خودتون نوشتید هم صحیح هست.
اما فکر می کنم از Event مناسبی استفاده نکردید. پیشنهاد می کنم، از رویداد ItemDataBound استفاده کنید، در این حالت دیگه نیازی نیست بعد از پر شدن لیست ویو دوباره روی اون حلقه بزنید و هر زمان که لیست بایند بشه تک تک رکوردهاش رو می تونید تغییر بدید.


بله درست می فرمائید , تون روز اونقدر سر این کد اعصاب خورد شده بود که متوجه نشده بودم
بازم ممنون از راهنمایی هاتون خیلی خیلی متشکر مشکل حل شد :چشمک: