مثال علي اعداد تقارير Microsoft Report - Client-Side Reporting الجزء الاول


     -          اولا اعداد مصدر البيانات الـ Dataset

في هذا المثال سوف نستخدم Dataset  كمصدر محلي للبيانات , يمكن ان نعيد البيانات الي Dataset من اي قاعده بيانات كـ SQL SERVER  او Oracle  او ....  
وفي الفقرة القادمه ساسرد طريقة ارجاع البيانات للـ Dataset  باستخدام SQL Server Table Valued Functions

1 -

من Project Solution  ومن Add New Item  نقوم باختيار Dataset  من النافذة التي ستظهر .
بعد اضافه Dataset  وباستخدام الـ Dataset Designer  نقوم بضغط الزر الايمن للماوس واختيار
 Add >> Data Table او يمكن افلاتها من  ToolBoxكما بالشكل :



2- بعد اضافه الـ Data Table  يمكننا اضافه الـ  Columns  وتسميتها كما نريد بالضغط علي الـ Data Table  
Add >> Column  , قمت باضافة الـ Columns   وحددت نوع البيانات كالاتي:



الان وبعد ان تم انشاء مصدر البيانات المحلي سيمكننا ان نربطه بالتقرير وسوف اقوم بشرح اعداد التقرير بالتفصيل في الجزء الثاني .
- ثانيا اعداد مصدر البيانات من SQlServer

1- 

بعد انشاء قاعدة البيانات سنقوم بانشاء الــ Table  التي سنستخدمها تحتوي علي Culomns الاتية


وهذا اسكريبت انشائها
-----------------------------------------------------------------------------------------------------------
/****** Object:  Table [dbo].[BirthDay]    Script Date: 02/23/2013 21:00:25 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[BirthDay](
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [FirstName] [nvarchar](50) NOT NULL,
      [LastName] [nvarchar](50) NOT NULL,
      [birthdayDate] [date] NOT NULL,
 CONSTRAINT [PK_BirthDay] PRIMARY KEY CLUSTERED
(
      [Id] 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 - 

الان سنقوم بانشاء Table Function  التي ستقوم بارجاع البيانات من الجدول خلال فتره معينة باستخدام 2 براميتر هما
يعبران عن بداية ونهاية الفترة كما في هذا السكريبت
-----------------------------------------------------------------------------------------------------------

/****** Object:  UserDefinedFunction [dbo].[FUBirthDayReport]    Script Date: 02/23/2013 21:06:07 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

Create FUNCTION [dbo].[FUBirthDayReport](@DateFrom Datetime , @DateTo Datetime)

RETURNS @BirthDayOrder Table
(
Se int identity(1,1) ,
FullName nvarchar(110) ,
BirthDay Date ,
DateFrom datetime ,
DateTo datetime
)
AS
Begin
declare @Crs Cursor ,
            @FullName nvarchar(50) ,
            @BirthDay Date;


Set @Crs = Cursor For Select FirstName + ' ' + LastName As FullName , birthdaydate
                                          From BirthDay
                                          Where birthdaydate Between @DateFrom And @DateTo
                                          Order by birthdaydate , FullName

Open @Crs ;
Fetch next From @Crs
           Into @FullName , @BirthDay ;

While(@@FETCH_STATUS = 0)
BEGIN
Insert into @BirthDayOrder
(FullName , BirthDay , DateFrom , DateTo)
values
(@FullName , @BirthDay , @DateFrom , @DateTo)

Fetch next From @Crs
           Into @FullName , @BirthDay ;

End
Close @Crs
Deallocate @Crs
Return ;
End
GO
------
- الان اصبحت مصادر البيانات جاهزة الجزء الثاني من هذا المقال سيتناول طريقة تصميم التقارير

التعامل مع DataGridView باستخدام C#


افترض ان الـ DataGridView  المستخدمه في الشرح التالي تتكون من  اعمدة تأخد الاسامي Column1 و Column2 .. 

1 – الانتقال الي خلية محددة -  Move to specific Cell


        
-          عن طريق تحديد رقم الخلية ورقم الصف

            dataGridView1.CurrentCell =dataGridView1.Rows[0].Cells[1];

في الكود السابق تم الانتقال للخلية الثانية في الصف الاول من  DataGridView

يمكن الاستعانه باسم العمود كالتالي
 dataGridView1.CurrentCell =
 dataGridView1.Rows[0].Cells[Column2.Index];




-          وللانتقال للخلية في نفس الصف
dataGridView1.CurrentCell =     dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[Column4.Index];


-          وللانتقال للخلية التاليه في نفس الصف

dataGridView1.CurrentCell =
dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[dataGridView1.CurrentCell.ColumnIndex + 1];

ولتفادي الخروج عن عدد الخلايا  - Out Of Range في الكود السابق


if (dataGridView1.CurrentCell.ColumnIndex != Column4.Index)
            {
dataGridView1.Rows[dataGridView1.CurrentRow.Index]
.Cells[dataGridView1.CurrentCell.ColumnIndex + 1];
            }
else
            {
dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0];
            }
 ---------------------------------------------------------------------------------------------------------------------------------

2 – معرفة قيمة خليه محدده -  Value of  specific Cell

-          نفس الكود السابقة باضافه الخاصية .Value يعد تحديد موقع الخلية

string MyCellValue =(string)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[Column2.Index].Value;

---------------------------------------------------------------------------------------------------------------------------------

3 – استخدام  foreach مع DataGridView  
  

يمكن استخدام  foreach من اجل معرفة قيمة كل الخلايا في عمود معين واستخدامها في مصفوفه او لارسالها الي قاعدة البيانات :

string[] array = new string[dataGridView1.Rows.Count - 1];
foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (!row.IsNewRow)
                {
                    array[row.Index] = (string)row.Cells[Column2.Index].Value;
                    MessageBox.Show(array[row.Index]);
                }
            }


فيجوال سي شارب VC# استخدام خاصية الاكمال التلقائي AutoComplete للـ ComboBox مع DataGridView واستدعاء البيانات من SQL Server db



اولا تقوم بانشاء الاعمده بالضغط علي  Edit Columans من DataGridView Tasks كما موضع بالشكل

ثم نقوم بالضغط علي Add  من مربع الحوار الذي سيظهر امامك وكما موضح بالشكل التالي نقوم بكتابه اسم العمود واختيار النوع "Type" DataGridViewComboBoxColumn  ثم نقوم بكتابه اسم العمود الذي سيظهر للمستخدم

بعد الضغط علي Add نقوم باختيار NoThing  من الخاصية DisplayStyle في Column Properties كما هو موضح بالشكل التالي :

بعد الضغط علي Ok , من DatagridView Properties  نقوم باضافه الحدث  EditingControlShowin بالضغط عليه بالماوس ليقوم بنقلنا الي الكود



وسيكون شكل الـ Event  المحتوي للكود كالتالي :

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
          
        }
نقوم بالاعلان عن ComboBox  قبل كتابه الكود وايضا استخدام المجال System.Data.SqlClient
ليكون شكل الكود في النهاية كالتالي :

----------------------------------------------------------------------------------------------------------------------------------------------------------------

using System;
using System.Data;
using System.Data.SqlClient;

ComboBox DataGridProductCombo;

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (dataGridView1.CurrentCell.ColumnIndex == ColProduct.Index)
            {
                using (SqlConnection MyConn = new SqlConnection(connString))
                {
                    MyConn.Open();
                   DataSet Datset = new DataSet();
                   SqlDataAdapter Adapter = new SqlDataAdapter("if exists( Select ProName     From Products) Select ProName From Products else select Null as ProName", MyConn);
                    Adapter.Fill(DatSet, "Products");
                    MyConn.Close();
                }
                DataGridProductCombo = (ComboBox)e.Control;
                DataGridProductCombo.DropDownStyle = ComboBoxStyle.DropDown;
                DataGridProductCombo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
                DataGridProductCombo.AutoCompleteSource = AutoCompleteSource.ListItems;
                DataGridProductCombo.DataSource = DatSet.Tables["Products"];
                DataGridProductCombo.ValueMember = "ProName";
                DataGridProductCombo.DisplayMember = "ProName";

            }
        }
------------------------------------------------------------------------------------------------------------------------------------------------------------------

نقوم باضافه الحدث CellValidating بنفس طريقة اضافه الحدث السابق EditingControlShowing

ثم نقوم بكتابه الكود ليكون كالتالي
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (e.ColumnIndex == ColProduct.DisplayIndex)
            {
                if (!ColProduct.Items.Contains(e.FormattedValue))
                {
                    ColProduct.Items.Add(e.FormattedValue);
                }
            }
        }

----------------------------------------------------------------------------------------------------------------------------------------------------------------
من المفترض ان تكون النتيجة كما بالشكل ادناه