15-10-12, 10:10 AM
كاتب الموضوع : !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
كما ان لدينا 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; }
}
كود :
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>
فى الجريد الثانية قمنا بعمل 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;
كود :
CustData Cust = (CustData)dataGrid1.SelectedItem;
int ID = Cust.CustID;
dataGrid2.ItemsSource = Cust.CustPurchase;
كود :
decimal TotalVal =Cust.CustPurchase.Sum(S=>S.ItemPrice);