تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[VB.NET] تفادي تكرار ادخال نفس العنصر في الداتاغريد فياو و تحديث خلية الكمية و السعر
#1
Heart 
السلام عليكم و رحمة الله 

ان شاء الله أموركم جيدة و في صحة و عافية 

لدي فقط مشكلة بسيطة في شاشة المبيعات فعند ادخال نفس العنصر عوض أن يضيف فقط الكمية ، إذا به يضيف العنصر نفسه مرة أخرى 

هذا هو كود في حدث Keydown  ل تاكست بوكس " الكمية "

------------------------------------------
كود :
  Private Sub qte_vente_KeyDown(sender As Object, e As KeyEventArgs) Handles qte_vente.KeyDown
        For i As Integer = 0 To DGVBill.Rows.Count - 1
            If qte_vente.Text = "" Then
                Return
            ElseIf DGVBill.Rows(i).Cells(1).Value = codebare_vente.Text Then
DGVBill.Rows(i).Cells(5).Value = Val(DGVBill.Rows(i).Cells(5).Value + Val(qte_vente.Text))
Exit Sub
          End If
        Next

مع العلم 'cells(5) هي خلية الكمية في DGV'



أود معرفة أين الخطأ في الكود و كيف أضيف الكمية +1 فقط عوض اضافة نفس العنصر

https://ibb.co/f0zyJj2 هذا رابط الصورة للتوضيح



قال الله تعالى:" وقلت استغفروا ربكم إنه كان غفارا يرسل السماء عليكم مدرارا و يمددكم بأموال وبنين ويجعل لكم جنات ويجعل لكم أنهار"
"أستغفر الله العظيم و أتوب إليه عدد ما كان و عدد مايكون و عدد الحركات و السكون"
الرد }}
#2
هل يوجد كود بعد else ؟ (أقصد هل يوجد غير المكتوب هنا؟)
لان الفراغ يفرق  في مربع النص .
الرد }}
#3
لا يا أخي سعود هذا هو الكود كما هو عندي في الفورم و قمت الآن بمسح الفراغات و أضفت ElseIf للكود



قال الله تعالى:" وقلت استغفروا ربكم إنه كان غفارا يرسل السماء عليكم مدرارا و يمددكم بأموال وبنين ويجعل لكم جنات ويجعل لكم أنهار"
"أستغفر الله العظيم و أتوب إليه عدد ما كان و عدد مايكون و عدد الحركات و السكون"
الرد }}
تم الشكر بواسطة: جيولوجي مبتدئ , جيولوجي مبتدئ
#4
وعليكم السلام ورحمة الله وبركاته

المفروض بعد تعديل الكمية أن تعطي أمر انهاء الحلقة أو الاجراء كي لا يضيفه مرة أخرى
كأن :
- تضيف بعد كود الاضافة كود(Exit For)  لانهاء الحلقة في حال هي من تظيف السطر الجديد 
- أو  تضيف (Exit Sub) لانهاء كامل الاجراء إذا كانت الاضافة بعد الحلقة.
فيصبح الكود هو :

كود :
 Private Sub qte_vente_KeyDown(sender As Object, e As KeyEventArgs) Handles qte_vente.KeyDown
       For i As Integer = 0 To DGVBill.Rows.Count - 1
           If qte_vente.Text = "" Then
               Return
           ElseIf DGVBill.Rows(i).Cells(1).Value = codebare_vente.Text Then
               DGVBill.Rows(i).Cells(5).Value = Val(DGVBill.Rows(i).Cells(5).Value + Val(qte_vente.Text))
            Exit Sub
           End If
       Next

قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}
#5
(01-08-22, 12:26 AM)Taha Okla كتب :

الغرض من الكود هو عند إضافة عنصر موجود مسبقا في الداتا غريد فياو يقوم الكود بإضافة الكمية أيا كانت التي هي موجودة في التاكست بوكس " الكمية" وليس اضافة العنصر مرة أخرى كما حدث معي هنا في الصورة ، نفس المشكلة لا زالت مستمرة  
للتنويه: هذا الكود للإضافة في DT



قال الله تعالى:" وقلت استغفروا ربكم إنه كان غفارا يرسل السماء عليكم مدرارا و يمددكم بأموال وبنين ويجعل لكم جنات ويجعل لكم أنهار"
"أستغفر الله العظيم و أتوب إليه عدد ما كان و عدد مايكون و عدد الحركات و السكون"
الرد }}
تم الشكر بواسطة: جيولوجي مبتدئ , ابراهيم ايبو
#6
الملف مرفق اذا انا فهمت بالشكل المطلوب
بدون قواعد بيانات فقط  ان الكود الخاص بك يعمل بشكل جيد

التالي كل كلاس الفورم لمن لا يريد تحميل المرفق
PHP كود :
Public Class Form1
    Private 
Function gid()
 
       Return dgv.Rows.Count
    End 
Function
 
   Private Sub Form1_Load(sender As System.ObjectAs System.EventArgsHandles MyBase.Load
        dgv
.AutoSizeColumnsMode DataGridViewAutoSizeColumnsMode.Fill
        Randomize
()
 
   End Sub
    Private Sub btnGen_Click
(sender As System.ObjectAs System.EventArgsHandles btnGen.Click
        txtbarcode
.Text Int(Rnd() * 999)
 
   End Sub
    Private Sub txtq_KeyDown
(sender As ObjectAs System.Windows.Forms.KeyEventArgsHandles txtq.KeyDown
        If e
.KeyData Keys.Enter Then
            If dgv
.Rows.Count IIf(dgv.AllowUserToAddRows10Then
                dgv
.Rows.Add(gidtxtbarcode.Texttxtname.Texttxtu.Texttxtunitpr.Texttxtq.Text)
 
           Else
                For i 
As Integer 0 To dgv.Rows.Count IIf(dgv.AllowUserToAddRows21)
 
                   If txtq.Text "" Then
                        Return
                    Else
                        If dgv
.Rows(i).Cells(1).Value txtbarcode.Text Then
                            dgv
.Rows(i).Cells(5).Value Val(dgv.Rows(i).Cells(5).Value Val(txtq.Text))
 
                       Else
                            Dim row 
As New DataGridViewRow
                            row
.CreateCells(dgv)
 
                           row.Cells(0).Value gid()
 
                           row.Cells(1).Value txtbarcode.Text
                            row
.Cells(2).Value txtname.Text
                            row
.Cells(3).Value txtu.Text
                            row
.Cells(4).Value txtunitpr.Text
                            row
.Cells(5).Value += Val(txtq.Text)
 
                           dgv.Rows.Add(row)
 
                       End If

 
                   End If
 
               Next
            End 
If
 
       End If
 
   End Sub
    Private Sub dgv_RowsAdded
(sender As ObjectAs System.Windows.Forms.DataGridViewRowsAddedEventArgsHandles dgv.RowsAdded
        dgv
.Rows(e.RowIndex).Cells(6).Value Val(dgv.Rows(e.RowIndex).Cells(4).Value) * Val(dgv.Rows(e.RowIndex).Cells(5).Value)
 
   End Sub
End 
Class 


الملفات المرفقة
.zip   wval.zip (الحجم : 15.74 ك ب / التحميلات : 5)
الرد }}
#7
اكتب الكود كامل
أو قم بارفاق المشروع للتعديل عليه

قال صلى الله عليه وسلم: 
«كلمتان خفيفتان على اللسان 
ثقيلتان في الميزان،حبيبتان إلى الرحمن: 
سبحان الله وبحمده، سبحان الله العظيم».
الرد }}
تم الشكر بواسطة: technomedia
#8
(01-08-22, 01:00 AM)Taha Okla كتب : اكتب الكود كامل
أو قم بارفاق المشروع للتعديل عليه


سأرفق الكود بعد التعديل ، شكرا جزيلا لك، وكل من حاول المساعدة ليستفيد الجميع ، علما أني ابتعدت كثيرا عن البرمجة مايفوق 3 سنوات لذلك تراني نسيت حتى البديهيات.
لكن بعد إذنك هل ممكن الكود دون خاصية Allow user to add Rows فأنا معطل لهذه الخاصية في الداتاغريد فياو؟



قال الله تعالى:" وقلت استغفروا ربكم إنه كان غفارا يرسل السماء عليكم مدرارا و يمددكم بأموال وبنين ويجعل لكم جنات ويجعل لكم أنهار"
"أستغفر الله العظيم و أتوب إليه عدد ما كان و عدد مايكون و عدد الحركات و السكون"
الرد }}
#9
كود :
Private Sub qte_vente_KeyDown(sender As Object, e As KeyEventArgs) Handles qte_vente.KeyDown
   
       If e.KeyCode = Keys.Enter Then
           If qte_vente.Text = "" Or qte_vente.Text = "0" Then
               MsgBox("أدخل الكمية المطلوبة")
           Else
               For i As Integer = 0 To DGVBill.Rows.Count - 1
                   If DGVBill.Rows(i).Cells(1).Value = codebare_vente.Text Then
                       DGVBill.Rows(i).Cells(5).Value = Val(DGVBill.Rows(i).Cells(5).Value + Val(qte_vente.Text))
                                            calcul()
                       Exit Sub
                   Else
                       Dim row As DataRow = dt.NewRow
                       row(0) = gid()
                       row(1) = codebare_vente.Text
                       row(2) = designation_vente.Text
                       row(3) = unite_vente.Text
                       row(4) = pd_vente.Text
                       row(5) = qte_vente.Text
                       row(6) = ptotal_vente.Text
                       dt.Rows.Add(row)
                       DGVBill.DataSource = dt
                       calcul()
                   End If
                   Exit Sub
               Next
           End If
     End If


الآن الكود يقوم بمنع تكرار الصف الأول فقط في الداتاغريد فياو وليس في كل الداتاغريد فياو كما هو مطلوب ، رغم وجود الدالة For (i)



قال الله تعالى:" وقلت استغفروا ربكم إنه كان غفارا يرسل السماء عليكم مدرارا و يمددكم بأموال وبنين ويجعل لكم جنات ويجعل لكم أنهار"
"أستغفر الله العظيم و أتوب إليه عدد ما كان و عدد مايكون و عدد الحركات و السكون"
الرد }}
#10
إقتباس :Allow user to add Rows
هذي لا تفعل الخاصية كما استخدمتها بالكود .
و انما معناها ان رقم  السطر الاخير  يختلف في حالتين 1-السماح باضافة صف جديد وقت التشغيل 2- عدم السماح.
فلو كان مسموح  يكون رقم الاخير = العدد الكلي ناقص 2
ولو غير مسموح يكون رقم الاخير = العدد الكلي ناقص 1

أبشرك حليتها
PHP كود :
Public Class Form1
    Private 
Function gid()
 
       Return dgv.Rows.Count
    End 
Function
 
   Private Sub Form1_Load(sender As System.ObjectAs System.EventArgsHandles MyBase.Load
        dgv
.AutoSizeColumnsMode DataGridViewAutoSizeColumnsMode.Fill
        Randomize
()
 
       btnGen.PerformClick()
 
   End Sub
    Private Sub btnGen_Click
(sender As System.ObjectAs System.EventArgsHandles btnGen.Click
        txtbarcode
.Text Int(Rnd() * 999)
 
   End Sub

    Private 
Function GetRowIndex(txt As String) As Integer
        For i 
As Integer 0 To dgv.Rows.Count IIf(dgv.AllowUserToAddRows21)
 
           Dim row As String dgv.Rows(i).Cells(1).Value
            If row 
txt Then
                Return i
                Exit 
Function
 
           End If
 
       Next
        Return Nothing
    End 
Function

 
   Private Sub txtq_KeyDown(sender As ObjectAs System.Windows.Forms.KeyEventArgsHandles txtq.KeyDown
        If e
.KeyData Keys.Enter Then
            If dgv
.Rows.Count IIf(dgv.AllowUserToAddRows10Then
                Dim row 
As New DataGridViewRow
                row
.CreateCells(dgv)
 
               row.Cells(0).Value gid()
 
               row.Cells(1).Value txtbarcode.Text
                row
.Cells(2).Value txtname.Text
                row
.Cells(3).Value txtu.Text
                row
.Cells(4).Value txtunitpr.Text
                row
.Cells(5).Value += Val(txtq.Text)
 
               dgv.Rows.Add(row)
 
           Else
                dgv
.CurrentCell dgv.Rows(GetRowIndex(txtbarcode.Text)).Cells(5)
 
               Dim row As String dgv.CurrentRow.Cells(1).Value
                If row 
txtbarcode.Text Then
                    dgv
.CurrentRow.Cells(5).Value Val(dgv.CurrentRow.Cells(5).Value Val(txtq.Text))
 
               Else
                    Dim Arow 
As New DataGridViewRow
                    Arow
.CreateCells(dgv)
 
                   Arow.Cells(0).Value gid()
 
                   Arow.Cells(1).Value txtbarcode.Text
                    Arow
.Cells(2).Value txtname.Text
                    Arow
.Cells(3).Value txtu.Text
                    Arow
.Cells(4).Value txtunitpr.Text
                    Arow
.Cells(5).Value += Val(txtq.Text)
 
                   dgv.Rows.Add(Arow)
 
               End If

 
           End If
 
       End If
 
   End Sub

    Private Sub dgv_CellValueChanged
(sender As ObjectAs System.Windows.Forms.DataGridViewCellEventArgsHandles dgv.CellValueChanged
        On Error Resume Next
        dgv
.Rows(dgv.CurrentRow.Index).Cells(6).Value Val(dgv.Rows(dgv.CurrentRow.Index).Cells(4).Value) * Val(dgv.Rows(dgv.CurrentRow.Index).Cells(5).Value)
 
   End Sub
    Private Sub dgv_RowsAdded
(sender As ObjectAs System.Windows.Forms.DataGridViewRowsAddedEventArgsHandles dgv.RowsAdded
        dgv
.Rows(e.RowIndex).Cells(6).Value Val(dgv.Rows(e.RowIndex).Cells(4).Value) * Val(dgv.Rows(e.RowIndex).Cells(5).Value)
 
   End Sub

End 
Class 

المثال بعد التصليح


الملفات المرفقة
.zip   wval.zip (الحجم : 15.9 ك ب / التحميلات : 11)
الرد }}



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


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