PDA

View Full Version : سوال: جستجو در ایتمهای لیست ویو



dharmaa
پنج شنبه 27 تیر 1392, 10:35 صبح
سلام بر دوستان.
من یه لیست ویو دارم که بایند شده به دیتا تیبل .حالا میخام توی ایتمهای این لیست ویو دنبال کلمه ای بگردم.
این کد نوشتم :
foreach (ListViewItem item in lsvCountry.Items)
{
if (item.Content.Equals(txtSearch .Text ))
{
item.IsSelected = true;
}
else
{
item.IsSelected = false;
}
}
ولی خطا میدهد:
Unable to cast object of type 'System.Data.DataRowView' to type 'System.Windows.Controls.ListViewItem
فکر میکنم چون لیست ویو رو با یه دیتا تیبل پر میکنم ایتمهای لیست ویو به عنوان یه دیتا رو در نظر گرفته شدن درسته؟
کسی حاضره راهنمایی ام کنه؟

hakim22
پنج شنبه 27 تیر 1392, 15:56 عصر
شما با ایتمهای درون لیست مثل Text همانهایی که در WinForm هستند رفتار می کنید. در حالی که UI در WPF خیلی پیچیده تر است. یک لیست ساده در WPF میتونه از چندین لایه تشکلیل شده باشه که تو در توی هم قرار دارند. خوب است از ابزارهایی مانند UI Spy استفاده کنید تا ببینید چه جنگلی پشت آیتم پنهان شده !!!

در WPF و Silverlight باید نه در میان آیتم های درون UI بلکه در میان List هایی که به آن Bind شده اند به دنبال شی مورد نظر خودتون بگردید و سپس Index رو به ListBox برده و آیتم رو انتخاب کنید.

داده هارو اول درون یک ObservableCollection بریزید و ListBox.ItemSource رو روی اون تنظیم کنید. حالا میتوانید با LINQ یا هر روش دیگری بین دادهها (در ObservableCollection) جستوج کنید. اندیس نتیجه را گرفته و با کمک آن آیتم مورد نظر در ListBox رو انتخاب کنید.

(از همین تکنیک برای حذف کردن یا اضافه کردن یک آیتم از ListBox استفاده کنید. در حقیقت وقتی شما به یک ObservableCollection یک داده ای رو اضافه کنید ListBox که به آن Bindشده هم بروز میشود و آیتم جدید را نشان می دهد.و حذف هم همینطور!)

کلا باید از ObservableCollection و اینترفیس INotifyPropertyChanged زیاد استفاده کنید تا در WPF راحت باشید !

dharmaa
پنج شنبه 27 تیر 1392, 18:39 عصر
ممنون که وقت گذاشتین و جواب دادین
من اومدم از ObservableCollectionاستفاده کردم ولی لیست ویو رو پر نکرد .این کدشه:
DataTable tbl = TblCountry.Select_tblCountry_All();
ObservableCollection <Countrylist> tblCountry;
tblCountry = new ObservableCollection<Countrylist>();
foreach (DataRow row in tbl.Rows)
{
var obj = new Countrylist()
{
IdCountry = (int)row["fldIdCountry"],
Country = (string)row["fldCountry"],
CountryCode = (string)row["fldCountryCode"],
Currancies = (string)row["fldCurrencies"]
};
tblCountry .Add(obj);
}
lsvCountry.ItemsSource = tblCountry;

public class Countrylist
{
public int IdCountry { get; set; }
public string Country { get; set; }
public string CountryCode { get; set; }
public string Currancies { get; set; }

}
کد xaml listview
<ListView.View>
<GridView>
<GridViewColumn Header="ردیف" Width=" 60" DisplayMemberBinding="{Binding Path=Row}" />
<GridViewColumn Header="کشور" Width=" 100" DisplayMemberBinding="{Binding Path=fldCountry}"/>
<GridViewColumn Header="کد کشور" Width=" 100" DisplayMemberBinding="{Binding Path=fldCountryCode}"/>
<GridViewColumn Header="واحد پول" Width="100" DisplayMemberBinding="{Binding Path=fldCurrencies}"/>
<GridViewColumn Header="fldIdCountry" Width="0" DisplayMemberBinding="{Binding Path=fldIdCountry}"/>
</GridView>
</ListView.View>
میشه بگین اشکال کار کجاست؟

Direlap
پنج شنبه 27 تیر 1392, 20:06 عصر
کلا باید از ObservableCollection و اینترفیس INotifyPropertyChanged زیاد استفاده کنید تا در WPF راحت باشید !

این دوتارو چطوری میتونم یاد بگیرم ؟

لینک آموزشی میشه بدید ؟

aryasoft2872
پنج شنبه 27 تیر 1392, 21:55 عصر
همنطوری که گفتن دوستمون توی سورس باید جستجو انجام بدید. توی حلقتون بایک cast آینم رو تبدیل به کلاسی که اطلاعات از اون جنسه بکنید و بعد هر کدوم از اطلاعات رو که می خواید بگیرید:
if ((item as ContryList).Country.Equals(txtSearch .Text ))
{
item.IsSelected = true;
}
else
{
item.IsSelected = false;
}

hakim22
پنج شنبه 27 تیر 1392, 21:56 عصر
کد مربوط به
lsvCountry.ItemsSource = tblCountry;

رو درون قسمت Load فرم قرار بدید. در ضمن این خط کد باید قبل از foreach یا هر کد دیگری که ObservableCollection را پر میکند قرار داشته باشد.
دقت کنید که ObservableCollection دو رویداد رو پاسخ میده ، اول اضافه شدن یک آیتم به Collection و دوم حذف شدن یک آیتم به Collection و هر وقت یکی از این دو رویداد اتفاق بیوفته UI که به آن Bind شده رو بروز میکنه در غیر این صورت هیچی !

پس ما اول ItemSource رو تنظیم می کنیم و بعدا آن را پر می کنیم تا رویداد Add رو تشخیص بده و لیست رو پر کنه .
(دقت کنید که ObservableCollection به تغییر یا Edit اشیای درونش حساس نیست مگر اینکه در تعریف کلاس شی از اینترفیس INotifyPropertyChange استفاده از کرده باشید)

hakim22
پنج شنبه 27 تیر 1392, 22:04 عصر
این دوتارو چطوری میتونم یاد بگیرم ؟
لینک آموزشی میشه بدید ؟


بسیاری از دوستان در برنامه نویسی WPF آن را شبیه Win From کار می کنند. اما مدلهای بسیار جالب تری مثل MVVM هست که برنامه نویسی رو دگرگون میکنه. و دیگه کار اصلی وصل کردن قسمتهای مختلف کد است تا کد نویسی خطی !
ObservableCollection چیز خاصی جز یک نوعی از Collection که به رویداد Add و Remove حساسه و این دوتا رو اعلام میکنه نیست. این یکی از خواص اشیای WPF است که اخباری که از ObservableCollection بدستشون میرسه رو فورا به UI منتقل می کنند.

در مورد INotifyPropertyChanged هم باید بدانید که یک Interface با تنها یک متد است که اگر در کلاسی آن را بکار بگیرید بعدا میتواند به علاوه بر Add و Remove رویداد Edit رو هم به UI خبر بده

مثلالهادر اینترنت فراوان است .

dharmaa
پنج شنبه 27 تیر 1392, 22:59 عصر
کد مربوط به
lsvCountry.ItemsSource = tblCountry;

رو درون قسمت Load فرم قرار بدید. در ضمن این خط کد باید قبل از foreach یا هر کد دیگری که ObservableCollection را پر میکند قرار داشته باشد.

این کار رو هم کردم ولی درست نشد . و هنوز لیست ویو رو پر نمیکنه

aryasoft2872
شنبه 29 تیر 1392, 15:35 عصر
این کار رو هم کردم ولی درست نشد . و هنوز لیست ویو رو پر نمیکنه

توی زمان تعریف ListView:
ItemSource={Binding}

dharmaa
یک شنبه 30 تیر 1392, 23:32 عصر
همنطوری که گفتن دوستمون توی سورس باید جستجو انجام بدید. توی حلقتون بایک cast آینم رو تبدیل به کلاسی که اطلاعات از اون جنسه بکنید و بعد هر کدوم از اطلاعات رو که می خواید بگیرید:
if ((item as ContryList).Country.Equals(txtSearch .Text ))
{
item.IsSelected = true;
}
else
{
item.IsSelected = false;
}
خب لیست ویو را با ObservableCollection پر کردم .برای سرچ در لیست ویو هم اومدم از کد بالا استفاده کردم همانطور که گفته بودین.
البته یه دستور foreach بهش اضافه کردم ولی روی خصوصیت IsSelected خطامیده.
foreach (Countrylist item in lsvCountry.Items )
{

if ((item).Country.Equals(txtSearch.Text))
{
item.IsSelected = true;
}
else
{
item.IsSelected = false;
}
}
اگر باز هم خواننده این کامنت و پاسخگویم باشید بسیار سپاسگذار خواهم بود.