الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استفسار عن العمليات الحسابية في Gridview

بدأه شايب الديمن في 14 سبتمبر 2009 · 10 رد · 2,899 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي عمل يحتوي على عدة جداول والأداة GridViwe كانت عنصر التحكم بالعمل

العمل عبارة عن عمليات حسابية كثير من جمع وطرح وقسمة وضرب والأعلى والأدنى وغيرها

بحثت عن إجراء العمليات الحسابية في GridViwe في المنتدى وقوقل ولم أجد ما يثلج الصدر

اسفساري هنا أن لدي GridViwe اسمها ( DataGridView1 ) وعدد من الصفوف والأعمدة وبالتالي الخلايا الت لم أجد من تعامل مع قيمها أريد أن أقول

الخلية الأولى في الصف ( السطر) الأول + الخلية الثانية في الصف ( السطر) الأول = ( الناتج يوضع في الخلية الثالثة في الصف ( السطر) الأول)

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

وكل عام وأنتم بألف خير

#2

مرحباً :)،

 

    [color= #000000; font-weight: bold;]Private Sub Sum[color= #009900;]([color= #009900;])

        [color= #b1b100;]For [color= #990000;]Each DRow [color= #b1b100;]As DataGridViewRow In DataGridView1[color= #339933;].Rows

            [color= #0000ff;]' Check if the current row is not a new row .

[color= #0000ff;]            If Not DRow.IsNewRow Then

[color= #0000ff;]                With DRow.Cells

[color= #0000ff;]                    ' Check [color= #b1b100;]if both of the cell[color= #009900;]([color= #cc66cc;]0[color= #009900;]) and cell[color= #009900;]([color= #cc66cc;]1[color= #009900;]) have numeric values

                    [color= #b1b100;]If IsNumeric[color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]0[color= #009900;])[color= #339933;].Value[color= #009900;]) And IsNumeric[color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]1[color= #009900;])[color= #339933;].Value[color= #009900;]) Then

                        [color= #339933;].Item[color= #009900;]([color= #cc66cc;]2[color= #009900;])[color= #339933;].Value [color= #339933;]= [color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]0[color= #009900;])[color= #339933;].Value [color= #339933;]+ [color= #339933;].Item[color= #009900;]([color= #cc66cc;]1[color= #009900;])[color= #339933;].Value[color= #009900;])

                    [color= #990000;]End [color= #b1b100;]If

                [color= #990000;]End With

            [color= #990000;]End [color= #b1b100;]If

        [color= #990000;]Next

    [color= #990000;]End Sub

يتم استدعاء هذا الإجراء بعد ملء الـ( DataGridView ) :)

بالتوفيق .

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 15 سبتمبر 2009 في 09:54

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#3

post-144471-1253008233_thumb.jpg

Bashar Rabat كتب:
مرحباً :) ،

  1. Private Sub Sum() For Each DRow As DataGridViewRow In DataGridView1.Rows
    ' Check if the current row is not a new row . If Not DRow.IsNewRow Then
    With DRow.Cells ' Check if both of the cell(0) and cell(1) have nu
    meric values If IsNumeric(.Item(0).Value) And IsNumeric(.Item(1).Value) The
    n .Item(2).Value = (.Item(0).Value + .Item(1).Value)
    End If End With End If Next End Sub
  2.  

يتم استدعاء هذا الإجراء بعد ملء الـ( DataGridView ) :)

بالتوفيق .

يخرج لي رسال خطأ وهذه الصورة في المرفقات

ربما الخطأ مني

أستخدم فيجوال دوت نت 2008

datagridview في تطبيق عادي وليس في ASP

ربما تفيد هذه المعلومات

#4
شايب الديمن كتب:
post-144471-1253008233_thumb.jpg

يخرج لي رسال خطأ وهذه الصورة في المرفقات

ربما الخطأ مني

أستخدم فيجوال دوت نت 2008

datagridview في تطبيق عادي وليس في ASP

ربما تفيد هذه المعلومات

هذا صحيح والسبب هو تشغيل الـ( Option Strict ) والتي يتم تشغيلها باستخدام التصريح التالي في بداية الـ( Code ) التصريح ( Option Strict On ), يمكنك الإستغناء عنه أو تعديل الإجراء ليصبح :

 

    [color= #000000; font-weight: bold;]Private Sub Sum[color= #009900;]([color= #009900;])

        [color= #b1b100;]For [color= #990000;]Each DRow [color= #b1b100;]As DataGridViewRow In DataGridView1[color= #339933;].Rows

            [color= #0000ff;]' Check if the current row is not a new row .

[color= #0000ff;]            If Not DRow.IsNewRow Then

[color= #0000ff;]                With DRow.Cells

[color= #0000ff;]                    ' Check [color= #b1b100;]if both of the cell[color= #009900;]([color= #cc66cc;]0[color= #009900;]) and cell[color= #009900;]([color= #cc66cc;]1[color= #009900;]) have numeric values

                    [color= #b1b100;]If IsNumeric[color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]0[color= #009900;])[color= #339933;].Value[color= #009900;]) And IsNumeric[color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]1[color= #009900;])[color= #339933;].Value[color= #009900;]) Then

                        [color= #339933;].Item[color= #009900;]([color= #cc66cc;]2[color= #009900;])[color= #339933;].Value [color= #339933;]= [color= #009900;](Double[color= #339933;].Parse[color= #009900;]([color= #339933;].Item[color= #009900;]([color= #cc66cc;]0[color= #009900;])[color= #339933;].Value[color= #339933;].ToString[color= #009900;]) [color= #339933;]+ Double[color= #339933;].Parse[color= #009900;](
[color= #339933;].Item[color= #009900;]([color= #cc66cc;]1[color= #009900;])[color= #339933;].Value[color= #339933;].ToString[color= #009900;])[color= #009900;])

                    [color= #990000;]End [color= #b1b100;]If

                [color= #990000;]End With

            [color= #990000;]End [color= #b1b100;]If

        [color= #990000;]Next

    [color= #990000;]End Sub

بالتوفيق :) .

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#5
Bashar Rabat كتب:
هذا صحيح والسبب هو تشغيل الـ( Option Strict ) والتي يتم تشغيلها باستخدام التصريح التالي في بداية الـ( Code ) التصريح ( Option Strict On ), يمكنك الإستغناء عنه أو تعديل الإجراء ليصبح :

  1. Private Sub Sum() For Each DRow As DataGridViewRow In DataGridView1.Rows
    ' Check if the current row is not a new row . If Not DRow.IsNewRow Then
    With DRow.Cells ' Check if both of the cell(0) and cell(1) have nu
    meric values If IsNumeric(.Item(0).Value) And IsNumeric(.Item(1).Value) The
    n .Item(2).Value = (Double.Parse(.Item(0).Value.ToString) + Double.Pars
    e(.Item(1).Value.ToString)) End If End With End
    If Next End Sub
  2.  
  3.  

بالتوفيق :) .

الله يعطيك العافية الكود تمام

جربته في عمليتي الجمع والطرح ممتاز

لكن لاحظت أنه مو يتحكم بالخلاي بل بكامل العمود

أريد التحكم بقيم الخلايا

لكن ممكن تشرحه سطر سطر

لأستفيد منه في باقي الجداول

لأن العمل كله عمليات حسابية وأرقام

فضلا وليس أمرا

تم تعديل هذه المشاركة بواسطة شايب الديمن في 15 سبتمبر 2009 في 22:53

#6

أهلاً أخي الكريم :)

في البداية استخدمنا حلقة ( For Each ) والتي من المعروف أنها تستخدم مع الكائنات بشكل مصدري أي تقوم بدوران على عناصر احدا المصفوفات أو المجموعات, يمكننا التعويض عنها بشيء من هذا القبيل :

 

[color= #b1b100;]For I [color= #b1b100;]As Int32 [color= #339933;]= [color= #cc66cc;]0 To DGV[color= #339933;].Rows[color= #339933;].[color= #990000;]Count [color= #339933;]- [color= #cc66cc;]1

Dim DRow [color= #b1b100;]As DataGridViewRow [color= #339933;]= DGV[color= #339933;].Rows[color= #009900;](I[color= #009900;])

[color= #990000;]Next I

طبعاً سبب استخدام الحلقة ( For Each ) هو دوران على جميع صفوف ( Rows ) الموجودة في الـ( DataGridView ) ليتم حساب مجموع قيم العمود الأول والعمود الثاني وادخال قيمة الحساب في العمود الثالث من الصف الحالي والذي تم الإشارة إليه بـ( DRow ) والخلية الثالث للصف الحالي تمثل بـ( .Item(2)) التي يمكن أن تمثل أيضاً على الشكل التالي ( بدون اختصار اي بدون استخدام With ) بـ( DRow.Cells.Item(2) أو ( DRow.Cells(2))، من الأمور الشائعة أن بعض المبتدئين يتوهوا مع المصفوفات والمجموعات من جانب الفهرسة وذلك لأن أساس المصفوفة أو المجموعة يبدأ بالـ( 0 )=( صفر ) اي العامود ثلاث يساوي ( Columns.Item( 2 )) .

استخدام العملية ( IsNumeric ) هذه العملية تساعدك على التأكد من أن القيمة المرسلة عبرها ( رقمية ) أي تحوي ( أرقام وفاصلة وليس شيء أخر ) .

استخدام العملية ( Double.Parse ) هذه العملية تخولك أن تقوم بتحويل أي كائن ( Object ) يحوي قيمة قابلة لتكون من نوع ( Double ) الى متغير من نوع ( Double ), تم استخدامها بالـ( Code ) السابق لتفادي ايقاف الـ( Option Strict ) .

بالنسبة للعمليات الحسابية أعتقد أن الفكرة وصلت ;) "جربته في عمليتي الجمع والطرح"،

الأن كيف تريد التحكم بقيم الخلايا ؟ -- ماهي الطريقة التي تستخدمها في عمل ماتريد ( رجاءً اشرح الفكرة بشكل موسع أكثر ) :) .

بالتوفيق :)

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 16 سبتمبر 2009 في 00:15

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#7
Bashar Rabat كتب:
أهلاً أخي الكريم :)

في البداية استخدمنا حلقة ( For Each ) والتي من المعروف أنها تستخدم مع الكائنات بشكل مصدري أي تقوم بدوران على عناصر احدا المصفوفات أو المجموعات, يمكننا التعويض عنها بشيء من هذا القبيل :

  1. For I As Int32 = 0 To DGV.Rows.Count - 1 Dim DRow As DataGridViewRow = DGV.Rows(I) Next I
  2.  

طبعاً سبب استخدام الحلقة ( For Each ) هو دوران على جميع صفوف ( Rows ) الموجودة في الـ( DataGridView ) ليتم حساب مجموع قيم العمود الأول والعمود الثاني وادخال قيمة الحساب في العمود الثالث من الصف الحالي والذي تم الإشارة إليه بـ( DRow ) والخلية الثالث للصف الحالي تمثل بـ( .Item(2)) التي يمكن أن تمثل أيضاً على الشكل التالي ( بدون اختصار اي بدون استخدام With ) بـ( DRow.Cells.Item(2) أو ( DRow.Cells(2))، من الأمور الشائعة أن بعض المبتدئين يتوهوا مع المصفوفات والمجموعات من جانب الفهرسة وذلك لأن أساس المصفوفة أو المجموعة يبدأ بالـ( 0 )=( صفر ) اي العامود ثلاث يساوي ( Columns.Item( 2 )) .

استخدام العملية ( IsNumeric ) هذه العملية تساعدك على التأكد من أن القيمة المرسلة عبرها ( رقمية ) أي تحوي ( أرقام وفاصلة وليس شيء أخر ) .

استخدام العملية ( Double.Parse ) هذه العملية تخولك أن تقوم بتحويل أي كائن ( Object ) يحوي قيمة قابلة لتكون من نوع ( Double ) الى متغير من نوع ( Double ), تم استخدامها بالـ( Code ) السابق لتفادي ايقاف الـ( Option Strict ) .

بالنسبة للعمليات الحسابية أعتقد أن الفكرة وصلت ;) "جربته في عمليتي الجمع والطرح"،

الأن كيف تريد التحكم بقيم الخلايا ؟ -- ماهي الطريقة التي تستخدمها في عمل ماتريد ( رجاءً اشرح الفكرة بشكل موسع أكثر ) :) .

بالتوفيق :)

الله يغفر لك ويسعدك

سؤالك عن التحكم بالخلايا؟

أريد الإشارة إلى الخلية مباشرة كأنها متغير وأضع قيمته

في الإكسيل نقول مثلا

F10=(F9*F8)

المتغيرات كأن نقول

Z = (A + B)

أريد نفسها هنا

بدون دوران أو تكرار كأن أقول مثلا

.Item(2).Value = (Double.Parse(.Item(0).Value.ToString) + Double.Parse(.Item(1).Value.ToString))

بمعنى أني أتعامل مع الخلية لوحدها

هل وصلت الفكرة

#8

س - هل وصلت الفكرة ؟

ج - بشكل ما :P

حسناً - بالنسبة للمطلوب فالعملية سهلة جداً كل ماعليّك فعله هو تحديد اي من الخلايا تريد أن تعالج بمعني أخر وعلى فرض أن ( الخلية رقم 1 من الصف الأول تساوي الخلية رقم 3 ناقص الخلية رقم 5 ) مثلاً ;)، يمكننا تمثيل ذلك بشيء مثل التالي :

ملاحظة ( لا تنسى أن الصفر مبدأ المصفوفات والمجموعات اي العنصر الأول من مصفوف يقرأ بـ( مصفوفة(0)) وليس بـ( مصفوفة(1)) :) )

Dim RowIndex As Int32 = 0
Dim MCellIndex As Int32 = 0
Dim SCellIndex As Int32 = 2
Dim SFCellIndex As Int32 = 4
With DataGridView1.Rows(RowIndex).Cells
.Item(MCellIndex).Value = (.Item(SCellIndex).Value - Item(SFCellIndex).Value )
End With

أو بدون استخدام متغيرات للفهرس :

With DataGridView1.Rows(0).Cells
.Item(0).Value = (Item(2).Value - Item(4).Value )
End With

بالتوفيق .

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#9
Bashar Rabat كتب:
س - هل وصلت الفكرة ؟

ج - بشكل ما :P

حسناً - بالنسبة للمطلوب فالعملية سهلة جداً كل ماعليّك فعله هو تحديد اي من الخلايا تريد أن تعالج بمعني أخر وعلى فرض أن ( الخلية رقم 1 من الصف الأول تساوي الخلية رقم 3 ناقص الخلية رقم 5 ) مثلاً ;) ، يمكننا تمثيل ذلك بشيء مثل التالي :

ملاحظة ( لا تنسى أن الصفر مبدأ المصفوفات والمجموعات اي العنصر الأول من مصفوف يقرأ بـ( مصفوفة(0)) وليس بـ( مصفوفة(1)) :) )

Dim RowIndex As Int32 = 0
 Dim MCellIndex As Int32 = 0
 Dim SCellIndex As Int32 = 2
 Dim SFCellIndex As Int32 = 4
 With DataGridView1.Rows(RowIndex).Cells
 .Item(MCellIndex).Value = (.Item(SCellIndex).Value - Item(SFCellIndex).Value )
 End With

أو بدون استخدام متغيرات للفهرس :

With DataGridView1.Rows(0).Cells
 .Item(0).Value = (Item(2).Value - Item(4).Value )
 End With

بالتوفيق .

الله يعطيك العافية

توصلت بالأمس لكود جميل للتحكم بالخلايا وهو

DataGridView1.Rows(5).Cells(2).Value = number

وأيضا

DataGridView1.Item(column number , row number)

وضعتها هنا ليستفيد منها الزوار والأعضاء

لكن خرجت لي مشكلة وهي عند تطبيق البرنامج وإعادة الترتيب تصاعدي أو تنازلي لا يتفاعل معه الكود السابق ولايتغير ترتيب الجدول وإنما يتغسر ترتيب البيانات

هل من حل؟

وشكرا

#10

Private Sub DataGrid_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGrid.CellEndEdit

If DataGrid.Columns(e.ColumnIndex).Name = "Qty" Orelse If DataGrid.Columns(e.ColumnIndex).Name = "Price" Then

' حيث Qty هو العمود الخاص بالكميه و Price هو اسم العمود الخاص بالسعر

DataGrid.Rows(DataGrid.CurrentRow.Index).Cells(7).Value = (DataGrid.Rows(DataGrid.CurrentRow.Index).Cells(5).Value * DataGrid.Rows(DataGrid.CurrentRow.Index).Cells(6).Value)

End If

End Sub

تضع ها الكود داخل الحدث DataGrid_CellEndEdit

منقول من موضوع الاستاذ BADRMEDIA مع وضع تعليقات بسيطه

http://vb4arab.com/vb/showthread.php?t=314&page=4

#11

السلام عليكــم ورحمـة الله وبركاتــه ،،

هناك طريقة أخرى للعمليات الحسابية

Private Sub DataGridView1_CellStateChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellStateChangedEventArgs) Handles DataGridView1.CellStateChanged

Call mathimatics()

End Sub

Private Sub DataGridView1_RowsAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded

Call mathimatics()

End Sub

Private Sub DataGridView1_RowsRemoved(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowsRemovedEventArgs) Handles DataGridView1.RowsRemoved

Call mathimatics()

End Sub

Sub mathimatics()

Dim mathims As Double = 0

Try

For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1

If Me.DataGridView1.Rows.Count > 1 Then

''''''''''''''''''''''''''''mathims += Me.DataGridView1("amount", i).Value

''''''''''''''''''''''''''''Me.TextBox1.Text = mathims

'Me.DataGridView1("amount", i).Value = CType(Me.DataGridView1("price", i).Value, Integer) * CType(Me.DataGridView1("quanity", i).Value, Integer) * CType(Me.DataGridView1("discount", i).Value / 100, Integer)

Me.DataGridView1("amount", i).Value = (Me.DataGridView1("price", i).Value * Me.DataGridView1("quanity", i).Value) * (Me.DataGridView1("discount", i).Value / 100)

End If

Next

'Me.DataGridView1("amount", i - 1).Value = mathims

Catch ex As Exception

End Try

End Sub

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…