ورود

View Full Version : رنگ کردن سطرهای دلخواه در دیتا گرید wpf



MRasoul
شنبه 08 آذر 1393, 12:33 عصر
سلام به همه
من یه دیتا گرید دارم با مثلا 15 تا سطر، حالا میخوام مثلا کل سطرهایی که مقدار سلول دومشون برابر "20" هست رو برام رنگ کنه ک از باقیه متمایز بشه
چجوری میشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟

MRasoul
شنبه 08 آذر 1393, 14:00 عصر
سلام به همه
من یه دیتا گرید دارم با مثلا 15 تا سطر، حالا میخوام مثلا کل سطرهایی که مقدار سلول دومشون برابر "20" هست رو برام رنگ کنه ک از باقیه متمایز بشه
چجوری میشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟
از همه تشکر، خودم پیداش کردم
اینجوریه که اول جدول مورد نظر رو از دیتابیس وارد یک datatable می کنیم و

for (int i = 0; i < datatable1.Rows.Count; i++)
if (datatable1.Rows[i][0].ToString()=="20")
{
var row = (DataGridRow)dg_test.ItemContainerGenerator.Contai nerFromIndex(i);
row.Background = Brushes.Red;
}

MRasoul
شنبه 08 آذر 1393, 14:02 عصر
حالا یه مشکلی هست و اون اینه که وقتی این کد بالا رو در ادامه کدهای مربوط به پر کردن DataGrid میذارم ک بلافاصله بعد از پر شدن رنگشون کنه، خطایی مبتی بر اینکه جدولت هنوز آماده نیس میده
باید چکار کنم؟؟؟؟؟؟؟؟؟؟؟؟
من نمیخوام ک این کدها در دکمه دیگه ای باشه

MRasoul
دوشنبه 10 آذر 1393, 10:44 صبح
چرا کسی سوالا منو جوااااااااااااااااااااااا اااب نمیدهههههههههههههههه:گریه: :گریه::گریه:
انگار الکی توی این سایت سوال میپرسم:افسرده:

_Memol_
چهارشنبه 12 آذر 1393, 01:21 صبح
سلام
ببین از بانک که خوندی توو یه لیست بریز و به DataSource اون DataGrid ات پاس بده
بعد توو رویداد LoadingRow مربوط به DataGrid بیا مقدارشو چک کن و رنگیش کن

SabaSabouhi
چهارشنبه 12 آذر 1393, 09:22 صبح
سلام
شاید این یه راه حل باشه، اما بهترین نیست، بهترین کار اینه که از امکانات و ویژگی‌های wpf استفاده کنی.
من از DataGrid استفاده نمی‌کنم چون کلا از محصولات DevExpress تو کارهام استفاده می‌کنم. اما مشکل شما با Binding حل می‌شه.
1. توی DataSource خودت یک Property از نوع رنگ تعریف کن.
2. با توجه به داده‌هایی که داری رنگ رو تعیین کن ( می‌تونه Readonly Property هم باشه )



public Color RowColor{
get{
return myValue > 0 ? Color.Black : Color.Red;
}
}

3. رنگ سطرها رو به این Property تعریف شده Bind کنی.

بقیه کارها رو خود Wpf برات انجام می‌ده.

نکته:
اگه خواستی رنگ در حین کار عوض بشه
1. کلاست باید INotifyPropertyChange رو implement کنه.
2. Property باید OnPropertyChanged رو فراخوانی کنه
3. لیستی که به عنوان Source به دیتاگرید می‌دی باید بجای <>List معمولی ObservationCollection باشه

صبا صبوحی

MRasoul
چهارشنبه 12 آذر 1393, 11:28 صبح
از هر دو دوست تشکر

MRasoul
چهارشنبه 12 آذر 1393, 22:12 عصر
سلام
شاید این یه راه حل باشه، اما بهترین نیست، بهترین کار اینه که از امکانات و ویژگی‌های wpf استفاده کنی.
من از DataGrid استفاده نمی‌کنم چون کلا از محصولات DevExpress تو کارهام استفاده می‌کنم. اما مشکل شما با Binding حل می‌شه.
1. توی DataSource خودت یک Property از نوع رنگ تعریف کن.
2. با توجه به داده‌هایی که داری رنگ رو تعیین کن ( می‌تونه Readonly Property هم باشه )



public Color RowColor{
get{
return myValue > 0 ? Color.Black : Color.Red;
}
}

3. رنگ سطرها رو به این Property تعریف شده Bind کنی.

بقیه کارها رو خود Wpf برات انجام می‌ده.

نکته:
اگه خواستی رنگ در حین کار عوض بشه
1. کلاست باید INotifyPropertyChange رو implement کنه.
2. Property باید OnPropertyChanged رو فراخوانی کنه
3. لیستی که به عنوان Source به دیتاگرید می‌دی باید بجای <>List معمولی ObservationCollection باشه

صبا صبوحی

خیلی ممنون از اینکه توجه کردید
ولی متاسفانه زیاد متوجه نشدم باید چ کنم
خواهشا اگر مشکلی نیست یه برنامه کوچیک در این مورد بذارین که دیتا گرید هنگام پر شدن بعضی سطرهاشم رنگی بشن؟مثلا سطرهایی که عدد 20 داخل ستون دومشونه
شرمنده

SabaSabouhi
سه شنبه 25 آذر 1393, 13:42 عصر
خیلی ممنون از اینکه توجه کردید
ولی متاسفانه زیاد متوجه نشدم باید چ کنم
خواهشا اگر مشکلی نیست یه برنامه کوچیک در این مورد بذارین که دیتا گرید هنگام پر شدن بعضی سطرهاشم رنگی بشن؟مثلا سطرهایی که عدد 20 داخل ستون دومشونه
شرمنده

سلام
تو Wpf بجای این که به کنترل و ستون‌های اون دقت کنی، باید به دیتا توجه کنی و Binding.
اینجا کاری به ستون و مقدار نمایش داده شده نداریم. توی خود ساختار دیتا باید بیشتر کار رو انجام بدی
یعنی مثلا یه کلاس داری به نام Invoice (فاکتور) که داخلش یه لیست از InvoiceItem ( اقلام فاکتور ) داری که این اقلام
رو می‌خوای تو یه دیتاگرید نمایش بدی.
1. تو کلاس اصلی ( Invoice ) بجای این که از لیست ( <List<InvoiceItem ) استفاده کنی از <ObservationCollection<InvoiceItem استفاده کنی.
2. کلاس اقلام ( InvoiceItem ) باید اینترفیس INotifyPropertyChanged رو Implement کنه. ( برای این که تغییرات رو بتونی تو دیتاگرید ببینی )
3. کلاس اقلام باید یک Property از جنس Brush داشته باشه برای رنگ اون ستون که مقدارش از مقدار عددی اون ستون به دست میاد.



public Brush CountColor{
get{
return Count == 20
? new SolidColorBrush( Colors.Red )
: new SolidColorBrush( Colors.Black );
}
}


4. Property مرجع ( ستون دوم شما ) باید در setter تابع OnPropertyChanged رو فراخوانی کنه ( مربوط به INotifyPropertyChanged )



public int Count {
get { return _count; }
set {
if ( _count == value ) return;
_count = value;
OnPropertyChanged( this, "Count" );
OnPropertyChanged( this, "CountColor" );
}
}


5. آخرین مرحله هم اینه که رنگ ستون مورد نظرتون رو به CountColor که به کلاس InvoiceItem اضافه کردین، Bind کنید.

صبا صبوحی

MRasoul
چهارشنبه 26 آذر 1393, 09:44 صبح
سلام
ممنون از توضیحات کاملتون
من رفتم اینا که گفتی رو انجام بدم اما متاسفانه نتونستم و متوجه نشدم
ببینید من یه جدول دارم توی دیتابیس که با دستورات sqlconnection , sqlcommand , sqldataadapter به دیتاگریدم بایند میکنم و نه کلاسی دارم و نه لیستی
اگر میشه روی اینا یه توضیحی بدین که چجوری انجام بدم
اگر وقت کنین یه نمونه برنامه ساده بذارین خیلی خیلی لطف میکنین
بازم خیلی خیلی تشکر

SabaSabouhi
چهارشنبه 26 آذر 1393, 12:20 عصر
سلام
متاسفانه برنامه‌ی نمونه کوچیک الان ندارم که براتون بفرستم. اما مشکل شما نداشتن همون کلاس‌ها هست.
من وقتی که نخوام از EF استفاده کنم و با SqlCommand کار کنم به این شکل عمل می‌کنم.
برای هر جدولی یک کلاس می‌سازم. این کلاس چند تا خاصیت باید داشته باشه.
1. INotifyPropertyChanged رو Implement کنه. این کار شامل این چند خط کد می‌شه:


public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged( string propertyName ) {
if ( PropertyChanged != null ) PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
}


2. Propertyها بجای این که ساده به صورت AutoProperty تعریف بشه با BackField و به شکل زیر تعریف می‌شه:


public int Id {
get { return _id; }
set {
if ( _id == value ) return;
_id = value;
OnPropertyChanged( this, "Id" );
}
}



3. Constructor خاصی برای این کلاس تعریف می‌کنم که یک DataRow می‌گیره و مقادیر رو Initialize می‌کنه. به این صورت
کافیه وقتی DataTable رو پر می‌کنی با یک خط کد linq لیست خودت رو پر کنی.


var myList = MyTable.Rows
.Cast<DataRow>()
.ToList()
.Convert( x=> new MyClass( x ) );

توجه کن که MyTable از نوع DataTable هست که با SqlAdapter خوندی و MyClass هم کلاسی هم که متناظر
جدولت ایجاد کردی. و myList هم لیستی هست که به دست آمده. ( از نوع: <List<MyClass )
4. حالا باید لیستت رو تبدیل به ObservationCollaction کنی.


var itemsSource = new ObservationCollection( myList );

5. این itemsSource رو تحویل DataGrid بده.

این توضیحات روش من بود برای ارتباط با دیتا به روش SqlCommand، برای رفع مشکل رنگ کردن ستون دوم، به پست‌های قبلی رجوع کن.

امیدوارم که توضیح کافی باشه

صبا صبوحی

MRasoul
چهارشنبه 26 آذر 1393, 13:31 عصر
خیلی ممنون
واقعا لطف کردین
انشالله بتونم با همین ، مشکلم رو حل کنم