تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
wpf tips- The DataGrid
#1
كاتب الموضوع : !TheCodeOfSilence


بسم الله الرحمن الرحيم

بعد انقطاع لفتره طويله اعود اليكم لنتحدث عن wpf data grid
عند بداية التعامل مع datagrid فانك تلاحظ انها مختلفة كثيرا عن الموجودة سابقا وهناك الكثير من العناصر غير موجود ولكن افضل طريقة للتعامل معها هي عدم التعامل معها مطلقا
ولكن اذا اردت ان تتعامل معها بالطرقة العادية فاليك هذه class والتى تعمل بطريقة extension methods
http://code.google.com/p/artur02/sou...aGridHelper.cs

اما اذا اردت التعامل معها بالطريقة الاخرى وهي اسهل بكثير صدقوني فيمكنك متابعة الموضوع
تذكرو اننا قلنا اننا لن نتعامل معها مباشرة
اولا لنفترض ان لدينا قاعدة بيانات تحتوي على جدولين احدهما لاسماء العملاء وبياناتهم والاخر لمشتريات هولاء العملاء

كود :
CREATE TABLE [dbo].[cust_data](
[serial] [int] IDENTITY(1,1) NOT NULL,
[cust_name] [varchar](500) NULL,
[cust_address] [varchar](500) NULL,
[mobile] [varchar](50) NULL,
CONSTRAINT [PK_cust_data] PRIMARY KEY CLUSTERED
(
[serial] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
CREATE TABLE [dbo].[cust_purchase](
[serial] [int] IDENTITY(1,1) NOT NULL,
[cust_id] [int] NULL,
[item_name] [varchar](50) NULL,
[item_price] [money] NULL,
CONSTRAINT [PK_cust_purchase] PRIMARY KEY CLUSTERED
(
[serial] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ثانيا لدينا 2 data grid لعرض البيانات الاولى لعرض بيانات العملاء والثانية لعرض تفاصيل المشتريات
كما ان لدينا textbox بحنوى على اجمالي قيمة المشتريات
سنقوم باستخدام linq للربط مع قاعدة البيانات ولكن ولا علينا تجهيز datagrid

اولا نقوم بعمل class يحتوي عل بيانات العملاء واخر يحتوى على بيانات المشتريات بهذه الطريقة

كود :
public class CustData
{
public int CustID
{ get; set; }
public string CustName
{ get; set; }
public string CustAddress
{ get; set; }
public string custMobile
{ get; set; }

public List<PurchaseData> CustPurchase
{ get; set; }
}

public class PurchaseData
{
public string ItemName
{ get; set; }
public decimal ItemPrice
{ get; set; }

}
ثانيا نقوم باضافة columns لل datagrid اولا بعض الخصائص من اجل العرض


كود :
AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False"
ثانيا بالنسبة للجريد الاولى نكتب الاتي

كود :
<DataGrid.Columns><DataGrid.Columns>
<DataGridTextColumn Header="اسم العميل" Binding="{Binding CustName}" IsReadOnly="True"/>
<DataGridTextColumn Header="العنوان" Binding="{Binding CustAddress}" IsReadOnly="True"/>
<DataGridTextColumn Header="رقم المحمول" Binding="{Binding custMobile}" IsReadOnly="True"/>
</DataGrid.Columns>
ثانيا بالنسبة للثانية
كود :
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="اسم المنتج" Binding="{Binding ItemName}" IsReadOnly="True"/>
<DataGridTextColumn Header="سعر المنتج" Binding="{Binding Path=ItemPrice, StringFormat=\{0:N\}}" IsReadOnly="True"/>
</DataGrid.Columns>
نلاحظ اولا اننا قمنا بعمل binding مع عناصر class التى انشاناها من قبل
فى الجريد الثانية قمنا بعمل format للسعر من خلال binding

الان كيف نقوم باضافة البيانات
سنقوم في الواقع بعمل list من الclass الموجودة لعرضة في datagrid

كود :
CustData_DCDataContext CData = new CustData_DCDataContext();
List<CustData> CustInfo = (from S in CData.cust_datas
select new CustData
{
CustID = S.serial,
CustName = S.cust_name,
CustAddress = S.cust_address,
custMobile = S.mobile,
CustPurchase = S.cust_purchases.Select(X => new PurchaseData
{
ItemName = X.item_name,
ItemPrice = X.item_price.Value
}).ToList<PurchaseData>()
}).ToList<CustData>();

dataGrid1.ItemsSource = CustInfo;
بهذا يجب ان يتم عرض بيانات العميل فى الجريد الاولي
اذا كبف نضيف البيانات في الجريد الثانية
بكل بساطة نحن قمنا باحضار البيانات المتبقى فقط هو ربطها
الجميل هنا ان كل سطر موجود فى الجريد هو فى الواقع class التي قمنا بتعريفها و بالتالي يمكنك تحويل هذا السطر الى هذه ال class والتعامل مع الclass
مثلا في الجريد الاولى لا يوجد عمود لعرض كود العميل ولكن الكود موجود بالفعل ويمكننا عرضه ببساطة بتحول السطر الى ال class بهذة الطريقة

كود :
CustData Cust = (CustData)dataGrid1.SelectedItem;
int ID = Cust.CustID;
ونستخدم نفس الطريقة لعرض باقي البيانات فلعرض التفاصيل نستخدم الحدث SelectionChanged للجريد الاولى


كود :
CustData Cust = (CustData)dataGrid1.SelectedItem;
int ID = Cust.CustID;
dataGrid2.ItemsSource = Cust.CustPurchase;
اما تجميع قيمة المشتريات فيكون هكذا

كود :
decimal TotalVal =Cust.CustPurchase.Sum(S=>S.ItemPrice);
والى اللقاء
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سؤال] كيف يمكن إضافة صف فوق صف أسماء الأعمدة DataGrid عبد الله 3 555 12-09-15, 12:15 AM
آخر رد: khodor1985
  [سؤال] تكرار ظهور الأعمدة DataGrid ItemsSource عبد الله 0 276 21-07-15, 07:00 AM
آخر رد: عبد الله
  wpf tips- The DataGrid part2 RaggiTech 0 583 15-10-12, 10:11 AM
آخر رد: RaggiTech
  wpf tips- validation RaggiTech 0 529 15-10-12, 10:09 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم