منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : طلب مساعدة فيما يخص tabcontrol
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
[attachment=23375] المرفقات لسلام عليكم 
من فضلكم أريد مساعدة فيما يخص   tabcontrol 
 عندي  tabcontrol بها 5 صفحات فاتورة مبيعات 
كيف أستطيع التعامل مع 5 زبائن قبل تسجيل الفاتورة  يعني أدخل المبيعات في فاتورة 1 ثم أتعامل مع 4 ثم 2 إلى أخره 
لا تبخلو عنا جزاكم الله كل خير
السلام عليكم ورحمة الله وبركاته
على ما فهمت فإن كل فاتورة مستقلة عن الأخرين
إذا كان كذلك فمن الممكن أن تضع لكل tab الأكواد الخاصة بها من إضافة وتعديل وحذف وإلخ
مع وضع شرط مهم جدا لحظة تنفيذ أمر الحفظ وهو ID المفتاح الخاص بكل فاتورة  حتى لا يتم التعارض بينهم بما إنك ستفتح الكل في نفس الوقت
وذلك بإستخدام دالة جلب اخر سجل 


وهناك فكرة أخرى كنت أفكر في تنفيذها وهي فكرة الفواتير المؤجلة وهى إنشاء جدول خاص للفواتير المؤجلة حتى ولو كان ملف xml  مع إمكانية وضع الحفظ والاستدعاء والحذف

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

تمنياتي لك بالتوفيق والنجاح
(07-11-19, 06:00 AM)princelovelorn كتب : [ -> ]
السلام عليكم ورحمة الله وبركاته
شكرا لك على الحل فكرت فيه لكنه طويل نوعا ما 
بارك الله فيك
الأفضل ان تعتمد على أدوات المستخدم user controls

صمم أداة كما تريد ولتكن هي شاشة الفاتورة الرئيسية
وثم أضف نسخة جديدة منها إلى صفحات الـتاب tab control في كل مرة تريد صفحة جديدة
لن تكتب كود لأكثر من صفحة، هي نفسها تنشء منها نسخة جديدة instance وتدرجها في بانل التاب وبأي عدد تريده
بدلا من كتابة نفس الكود خمسة مرات أو على حسب ما تحتاج

كل هذا بالكود وقت التشغيل

هل وضحت الفكرة ؟
[attachment=23374]    المرفقات 
شكرا لكن لم أستوعبها و هدا المثال في الرابط
أخي نوري هذا كود ملف FACTVENTE


واعتذر لانه لا يمكنني رفع ملف المشروع

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

يمكنك الآن حذف صفحات التاب الموجودة مع شرط الابقاء على الأولى

كود :
Public Class FACTVENTE


   Private Sub FACTVENTE_Load(sender As Object, e As EventArgs) Handles MyBase.Load

       '// fillDGV(DataGridView1, "select * from PRODUITS order by CODEPRODUIT")
       '  TEXTVENTECODE.Text = CODE_GEN("FACTVENTE", "VENTECODE") + 1
       TEXTTOTALVENTE.Text = "0.00"

   End Sub

   Sub retour_FACTVENTE(ByVal CODE_)
       DataGridView2.Rows.Clear()
       Dim DT As New DataTable
       Dim da As New SqlClient.SqlDataAdapter("SELECT * FROM FACTVENTE where VENTECODE = " & CODE_ & "", sqlConn)
       da.Fill(DT)
       'If DT.Rows.Count = 0 Then
       '    MessageBox.Show("الرجاء التأكد من رقم الفاتورة", "رسالة تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Error)
       'Else
       Dim dr = DT.Rows(0)
       TEXTVENTECODE.Text = dr!VENTECODE
       TEXTVENTETYPE.Text = dr!VENTETYPE
       TEXTNOMCLIENT.Text = dr!NOMCLIENT
       VENTEDATE.Value = dr!VENTEDATE
       TEXTTOTALVENTE.Text = dr!TOTALVENTE

       Dim DS As New DataSet
       da = New SqlClient.SqlDataAdapter("SELECT * FROM DETFACTVENTE where FACTVENTECODE = " & CODE_ & "", sqlConn)
       DS = New DataSet
       da.Fill(DS)
       DT = DS.Tables(0)
       For I = 0 To DT.Rows.Count - 1
           DataGridView2.Rows.Add()
           DataGridView2.Rows(I).Cells(0).Value = DT.Rows(I).Item("CODEPRODUIT")
           DataGridView2.Rows(I).Cells(1).Value = DT.Rows(I).Item("NOMPRODUIT")
           DataGridView2.Rows(I).Cells(3).Value = DT.Rows(I).Item("PRIXACHATPRODUIT")
           DataGridView2.Rows(I).Cells(4).Value = DT.Rows(I).Item("PRIXVENTEPRODUIT")
           DataGridView2.Rows(I).Cells(5).Value = DT.Rows(I).Item("TOTALE")
           DataGridView2.Rows(I).Cells(6).Value = DT.Rows(I).Item("QTTVENDUE")
           Dim DT1 As New DataTable
           Dim DA1 As New SqlClient.SqlDataAdapter("SELECT * FROM PRODUITS WHERE NOMPRODUIT LIKE N'" & DataGridView2.Rows(I).Cells(1).Value & "'", sqlConn)
           DA1.Fill(DT1)
           Dim BAR As Integer
           BAR = DataGridView2.Rows.Count - 1
           DataGridView2(2, BAR).Value = DT1.Rows(0).Item("QTTPRODUIT")

       Next
   End Sub

   Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
       If DataGridView1(0, DataGridView1.CurrentRow.Index).Selected = True Then
           'For I = 0 To SALEPIL.DataGridView2.Rows.Count - 1
           textBcode.Text = DataGridView2.CurrentRow.Cells(1).Value
           textBcode_Leave(sender, e)


       End If
   End Sub

   Private Sub textBcode_TextChanged(sender As Object, e As EventArgs) Handles textBcode.TextChanged

   End Sub


   Sub calc()

       Dim SelecedGridView As DataGridView

       For Each ctrl As Control In TabControl1.SelectedTab.Controls
           Dim dgv As DataGridView = TryCast(ctrl, DataGridView)
           If dgv IsNot Nothing Then
               SelecedGridView = dgv
               Exit For
           End If
       Next


       ' الان للتعامل مع الداتا جريد المحددة استخدم المتغير SelecedGridView
       '
       '
       For i As Integer = 0 To SelecedGridView.Rows.Count - 1
           SelecedGridView.Rows(i).Cells(5).Value = Val(SelecedGridView.Rows(i).Cells(4).Value) * Val(SelecedGridView.Rows(i).Cells(6).Value)
           'SelecedGridView.Rows(i).Cells(7).Value = Val(SelecedGridView.Rows(i).Cells(2).Value) - Val(SelecedGridView.Rows(i).Cells(6).Value)
       Next
       Dim tot As Double
       For i = 0 To SelecedGridView.Rows.Count - 1
           tot = Val(tot) + Val(SelecedGridView.Rows(i).Cells(5).Value)
           'disc = Val(disc) + Val(DataGridView1.Rows(i).Cells(5).Value)
           'qttin = Val(qttin) + Val(DataGridView1.Rows(i).Cells(4).Value)
           'numeroitem = DataGridView1.Rows.Count
       Next
       TEXTTOTALVENTE.Text = Val(tot)
       'textsale_ITEM_COUNT.Text = numeroitem
       'TOTALQTT.Text = qttin

       'fauxsaletotale.Text = Val(saleTOTAL.Text)
       'Dim r As Decimal
       'r = Convert.ToDecimal(fauxsaletotale.Text)

   End Sub
   Private Sub textBcode_Leave(sender As Object, e As EventArgs) Handles textBcode.Leave

       Dim SelecedGridView As DataGridView

       For Each ctrl As Control In TabControl1.SelectedTab.Controls
           Dim dgv As DataGridView = TryCast(ctrl, DataGridView)
           If dgv IsNot Nothing Then
               SelecedGridView = dgv
               Exit For
           End If
       Next


       ' الان للتعامل مع الداتا جريد المحددة استخدم المتغير SelecedGridView
       '
       '

       'For M As Integer = 0 To DataGridView2.Rows.Count - 1
       '    DataGridView2.Rows(M).Cells(5).Value = Date.Now
       'Next
       'For g As Integer = 0 To DataGridView1.Rows.Count - 1
       '    'Dim textdate1 As Date = DataGridView1.Rows(g).Cells(8).Value
       '    Dim textdate2 As Date = DataGridView1.Rows(g).Cells(10).Value
       '    Dim result As TimeSpan = textdate1 - textdate2
       '    Label12.Text = CInt(result.Days)
       '    DataGridView1.Rows(g).Cells(10).Value = Label12.Text
       'Next

       If textBcode.Text <> Nothing Then
           Dim DT As New DataTable
           Dim DA As New SqlClient.SqlDataAdapter("SELECT * FROM PRODUITS WHERE NOMPRODUIT LIKE N'" & textBcode.Text & "'", sqlConn)
           DA.Fill(DT)
           If DT.Rows.Count > 0 Then
               '______________________التحقق من كود الصنف
               For I = 0 To SelecedGridView.Rows.Count - 1
                   If SelecedGridView.Rows(I).Cells(0).Value = DT.Rows(0).Item("CODEPRODUIT") Then
                       SelecedGridView.Rows(I).Cells(6).Value = SelecedGridView.Rows(I).Cells(6).Value + 1
                       calc()
                       textBcode.Clear()
                       Exit Sub
                   End If
               Next
               '______________________إضافة سجل للداتا قريد
               Dim BAR As Integer
               SelecedGridView.Rows.Add()
               BAR = SelecedGridView.Rows.Count - 1
               SelecedGridView(0, BAR).Value = DT.Rows(0).Item("CODEPRODUIT")
               SelecedGridView(1, BAR).Value = DT.Rows(0).Item("NOMPRODUIT")
               SelecedGridView(2, BAR).Value = DT.Rows(0).Item("QTTPRODUIT")
               SelecedGridView(3, BAR).Value = DT.Rows(0).Item("PRIXACHATPRODUIT")
               SelecedGridView(4, BAR).Value = DT.Rows(0).Item("PRIXVENTEPRODUIT")
               'SelecedGridView(7, BAR).Value = DT.Rows(0).Item("QTTPRODUIT")
               'SelecedGridView(5, BAR).Value = DT.Rows(0).Item("TOTALE")
               'SelecedGridView(7, BAR).Value = DT.Rows(0).Item("ITEM_TAKLOFA")
               SelecedGridView(6, BAR).Value = 1
               SelecedGridView(6, BAR).Selected = True


               calc()

           Else
               'FRM_ITEMS.Show()
               'Clipboard.SetText(textBcode.Text.Trim())
               'FRM_ITEMS.textBarecode.Paste()
               Console.Beep()
           End If
       End If
       textBcode.Clear()
       textBcode.Focus()
       calc()
       'If DataGridView1.Rows.Count > 0 Then
       '    GroupBox17.Visible = False
       'Else
       '    GroupBox17.Visible = True
       'End If

   End Sub

   Private Sub textBcode_KeyDown(sender As Object, e As KeyEventArgs) Handles textBcode.KeyDown
       If e.KeyCode = Keys.Enter Then
           textBcode_Leave(sender, e)
       End If
   End Sub

   Private Sub btnsave_Click(sender As Object, e As EventArgs) Handles btnsave.Click

       Dim SelecedGridView As DataGridView

       For Each ctrl As Control In TabControl1.SelectedTab.Controls
           Dim dgv As DataGridView = TryCast(ctrl, DataGridView)
           If dgv IsNot Nothing Then
               SelecedGridView = dgv
               Exit For
           End If
       Next


       ' الان للتعامل مع الداتا جريد المحددة استخدم المتغير SelecedGridView
       '
       '

       If SelecedGridView.Rows.Count = 0 Then
           MessageBox.Show("لا توجد اصناف لحفظها", "رسالة تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Error)
           Exit Sub
       End If
       For I As Integer = 0 To SelecedGridView.Rows.Count - 1
           If SelecedGridView.Rows(I).Cells(6).Value = 0 Then
               MessageBox.Show("الرجاء التحقق من الكمية", "رسالة تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Error)
           End If
       Next
       Dim dt As New DataTable
       Dim da As New SqlClient.SqlDataAdapter("select * from FACTVENTE where VENTECODE = " & TEXTVENTECODE.Text & "", sqlConn)
       da.Fill(dt)
       'If dt.Rows.Count > 0 Then
       '    TEXTVENTECODE.Text = CODE_GEN("SALEPIL", "SALE_CODE") + 1
       'Else
       Dim DR = dt.NewRow
       DR!VENTECODE = TEXTVENTECODE.Text
       DR!VENTETYPE = TEXTVENTETYPE.Text
       DR!NOMCLIENT = TEXTNOMCLIENT.Text
       DR!VENTEDATE = VENTEDATE.Value
       DR!TOTALVENTE = TEXTTOTALVENTE.Text
       'DR!SALE_ITEM_COUNT = textsale_ITEM_COUNT.Text
       '    DR!SALE_TOTAL_ARABIC = TOTALARABIC.Text
       '    DR!SALE_TOTAL_QTT = TOTALQTT.Text
       '    DR!SALE_USER = TOOLUSER.Text
       '    DR!CUST_FAREK = Val(TextBox5.Text)
       '    DR!SALE_STATE = True

       dt.Rows.Add(DR)
       Dim save As New SqlClient.SqlCommandBuilder(da)
       da.Update(dt)
       'End If
       da = New SqlClient.SqlDataAdapter("select * from DETFACTVENTE", sqlConn)
       da.Fill(dt)
       For I As Integer = 0 To SelecedGridView.Rows.Count - 1
           Dim DR1 = dt.NewRow
           DR1!FACTVENTECODE = TEXTVENTECODE.Text
           DR1!VENTEDATE = VENTEDATE.Value
           DR1!CODEPRODUIT = SelecedGridView.Rows(I).Cells(0).Value
           DR1!NOMPRODUIT = SelecedGridView.Rows(I).Cells(1).Value
           'DR1!ITEM_UNITE = SelecedGridView.Rows(I).Cells(2).Value
           DR1!QTTVENDUE = Val(SelecedGridView.Rows(I).Cells(6).Value)
           DR1!PRIXVENTEPRODUIT = Val(SelecedGridView.Rows(I).Cells(4).Value)
           DR1!PRIXACHATPRODUIT = Val(SelecedGridView.Rows(I).Cells(3).Value)
           DR1!TOTALE = Val(SelecedGridView.Rows(I).Cells(5).Value)
           DR1!QTTPRODUITINITIAL = Val(SelecedGridView.Rows(I).Cells(7).Value)
           'DR1!SALE_ITEM_COUNT = textsale_ITEM_COUNT.Text
           'DR1!SALE_USER = TOOLUSER.Text
           DR1!QTTPRODUIT = SelecedGridView.Rows(I).Cells(2).Value
           'DR1!ITEM_BARE = SelecedGridView.Rows(I).Cells(8).Value
           'DR1!ITEM_TAKLOFA = SelecedGridView.Rows(I).Cells(9).Value
           'DR1!ITEM_PLACE = SelecedGridView.Rows(I).Cells(5).Value
           'DR1!SALE_DET_STATUS = True
           dt.Rows.Add(DR1)
           Dim cmd As New SqlClient.SqlCommandBuilder(da)
           da.Update(dt)
       Next





       '__________________________________طرح الكمية
       For M As Integer = 0 To SelecedGridView.Rows.Count - 1
           Dim newqtt As Integer
           newqtt = Val(SelecedGridView.Rows(M).Cells(2).Value) - Val(SelecedGridView.Rows(M).Cells(6).Value)
           Dim cmd1 As New SqlClient.SqlCommand
           cmd1.Connection = sqlConn
           cmd1.CommandText = " UPDATE PRODUITS SET QTTPRODUIT = " & newqtt & " where NOMPRODUIT = N'" & SelecedGridView.Rows(M).Cells(1).Value & " '"
           cmd1.ExecuteNonQuery()
       Next
       'b_Click(sender, e)
       MessageBox.Show("تم حفظ الفاتورة بنجاح", "رسالة تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information)

       'End If

       'SelecedGridView.Rows.Clear()



   End Sub

   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
       ''Dim r As Decimal
       ''r = Convert.ToDecimal(TEXTTOTALVENTE.Text)
       'TEXTTOTALVENTE.Text = Format(TEXTTOTALVENTE, "currency")
   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       RETOURFACTVENTE.Show()

   End Sub

   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

       ''''
       ''''كود اضافة تاب جديد واضافة داتاجريدفيو له
       ''''

       'References to source and target grid.
       Dim sourceGrid As DataGridView = Me.DataGridView2

       'بناء datagridview جديدة في كل مرة
       Dim NewGrid As DataGridView = New DataGridView

       ' يمكنك التحكم في خصائص الجريد الجديدة مثل الخط واللون وشكل وارتفاع الاعمدة وغيرها
       ' NewGrid.AllowUserToAddRows = False

       'Clear target columns and then clone all source columns.
       NewGrid.Columns.Clear()

       For Each column As DataGridViewColumn In sourceGrid.Columns
           NewGrid.Columns.Add(CType(column.Clone(), DataGridViewColumn))
       Next

       ' بناء صفحة تاب جديدة
       Dim newTabPage As TabPage = New TabPage
       newTabPage.Name = TabControl1.TabCount + 1
       newTabPage.Text = "فاتورة " & TabControl1.TabCount + 1
       newTabPage.Controls.Add(NewGrid)
       NewGrid.Dock = DockStyle.Fill
       Me.TabControl1.TabPages.Add(newTabPage)
       TabControl1.SelectTab(newTabPage)
   End Sub

End Class
(08-11-19, 05:30 AM)محمد كريّم كتب : [ -> ]
شكرا أخي الكريم بارك الله فيك و جزاك الله عنا كل خير