Public Class frmOperation #Region "Séparateur décimal selon les regional settings" Private Const LOCALE_SDECIMAL As Integer = &HE Private Declare Auto Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Integer, ByVal LCType As Integer, ByVal lpLCData As String, ByVal cchData As Integer) As Integer Private Declare Auto Function GetUserDefaultLCID Lib "kernel32" () As Integer ''' <summary> ''' Renvoie le séparateur décimal correspondant au Regional Settings propres au poste client ''' </summary> ''' <value></value> ''' <returns>Caractère séparateur, type Char</returns> ''' <remarks>Propriété en lecture seule</remarks> Public ReadOnly Property Separator() As Char Get 'vérifié à chaque usage Dim sSeparator As String = " " GetLocaleInfo(GetUserDefaultLCID, LOCALE_SDECIMAL, sSeparator, 1) Return sSeparator(0) End Get End Property #End Region Public Canceled As Boolean = True Public Operation As New clsAccountItem Private Sub frmOperation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txtCredit.Text = "0" txtDebit.Text = "0" End Sub Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click Me.Close() End Sub Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAdd.Click With Me.Operation .DateOperation = mcDateOperation.SelectionRange.Start .TypeOperation = cboType.Text .Budget = cboBudget.Text .Commentaires = txtComments.Text Double.TryParse(txtCredit.Text, .Credit) Double.TryParse(txtDebit.Text, .Debit) .Pointage = optPoint1.Checked .Mensuel = optMens1.Checked If .Credit.Equals(.Debit) AndAlso .Debit.Equals(0.0#) Then MessageBox.Show("Opération invalide" & Environment.NewLine & "Crédit et Débit NULL") txtCredit.Focus() Else Me.Canceled = False Me.Close() End If End With End Sub Private Sub txtCredit_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtCredit.KeyPress, txtDebit.KeyPress 'interdit le coller If e.KeyChar.Equals(Convert.ToChar(22)) Then e.Handled = True Else Dim sAccept As String = "0123456789.," & Convert.ToChar(Keys.Back).ToString Dim bFound As Boolean = False For i As Integer = 0 To sAccept.Length - 1 If sAccept(i) = e.KeyChar Then 'virgule = point, ou l'inverse If (e.KeyChar.Equals("."c) And Me.Separator.Equals(","c)) _ Or (e.KeyChar.Equals(","c) And Me.Separator.Equals("."c)) _ Then e.KeyChar = Me.Separator End If bFound = True Exit For End If Next If Not bFound Then e.Handled = True Else 'exception quand même pour le multipoints If DirectCast(sender, System.Windows.Forms.TextBox).Text.Contains(Me.Separator) AndAlso e.KeyChar.Equals(Me.Separator) Then e.Handled = True End If End If End If End Sub End Class
et t'auras un crash si le séparateur est le "."C'est vrai, mais je pensais qu'en france / europe s'était toujours pareil.
ou plutôt non : tu censures tout utilisateur ayant autre chose que la virgule, ce sans même l'en informer
et MsgBox c'est pas du dotnetvi je sais mais c'est plus rapide à taper que le messagebox.show, je l'aurais modifier au final bien sûr
et vbCrLf c'est pas du dotnet
et tu as fais la même erreur que moi, à savoir mettre annule à false par défaut (et s'il clique sur la croix?)Ben il ne se passe rien normalement puisque je test l'appui sur "OK"
If add.DialogResult = Windows.Forms.DialogResult.OK And Not add.annule Then
et si tu veux appliquer des valeurs par défaut, à part les combos, j'aurais plutôt vu çà depuis la form, appelant par exemple SA ligne -> .SetDefaultProperties, puis irait la lire ensuitelà j'ai peur de ne pas avoir bien compri.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionPrivate Sub Bp_add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bp_add.Click 'déclare une nouvel instance de la form F_op Dim add As New F_op ' Renseigne la variable "enfant" (dans F_op : Public new_ligne As New ligne_compte) add.txt_credit.Text = "0" add.txt_debit.Text = "0" add.Combo_budget.DataSource = mon_compte.budgets add.Combo_type.DataSource = mon_compte.types add.calendrier.TodayDate = Now add.Chk_pointage.Checked = False add.Chk_mensuel.Checked = False add.ShowDialog() If add.valide Then mon_compte.lignes.Add(F_op.new_ligne) mon_compte.save(Fichier) ' a faire dans la classe compte la miseAjour_lv ' ListView1.Items.Add(F_op.new_ligne.ToListViewItem) ' à supprimer ensuite... MiseAjour_LV() End If add = Nothing End Sub
Private Shared Function ComparisonByDateOperationAsc(ByVal x As clsAccountItem, ByVal y As clsAccountItem) As Integer Return x.DateOperation.CompareTo(y.DateOperation) End Function
Ordre actuel : DATE TYPE BUDGET CREDIT DEBIT POINTAGE MENSUEL 02/01/2010 00:00:00 CB divers 10 20 True True 02/01/2010 00:00:00 CB alimentaire 20 30 True False 23/01/2010 00:00:00 CB divers 99 996,6 True True 12/01/2010 00:00:00 VIR divers 0 40 False True 03/01/2010 00:00:00 TPV divers 0 16 False False Ordre par date ASC: DATE TYPE BUDGET CREDIT DEBIT POINTAGE MENSUEL 02/01/2010 00:00:00 CB alimentaire 20 30 True False 02/01/2010 00:00:00 CB divers 10 20 True True 03/01/2010 00:00:00 TPV divers 0 16 False False 12/01/2010 00:00:00 VIR divers 0 40 False True 23/01/2010 00:00:00 CB divers 99 996,6 True True
par chance il y a de bons exemples dans la MSDNpour un pro comme toi surrement, mais for me c'est la grosse loose
Le travail sur les tableaux est beaucoup plus rapide que sur les collections.bon j'suis pas à encore à mille lignes mais bon...c'est décourageant non ?
Par exemple , pour stocker 1000 string dans un tableau ou une collection, l'usage du tableau est 60% plus rapide.
Imports System Imports System.Collections.Generic Public Class trie_lignes Implements IComparer(Of ligne_compte) Public Function Compare(ByVal x As ligne_compte, ByVal y As ligne_compte) As Integer Implements System.Collections.Generic.IComparer(Of ligne_compte).Compare Return x.L_date.CompareTo(y.L_date) End Function End Class
Public Class SortListClass Implements IComparer(Of Basket) Public Function Compare(ByVal x As Basket, ByVal y As Basket) As Integer Implements System.Collections.Generic.IComparer(Of Basket).Compare If x.TaskList(0).StartTime < y.TaskList(0).StartTime Then Return -1 ElseIf x.TaskList(0).StartTime = y.TaskList(0).StartTime Then Return 0 Else Return 1 End If End Function End Class Private Sub SortActiveList() Dim MyComparer As New SortListClass ActiveList.Sort(MyComparer) End Sub
déja j'ai pas taclass.items.sort(), mais plutôt mon_compte.lignes.sort(), donc je le redis j'ai du me vautrer dés le début de la class.
'mon code : CurrentAccount.Items.Sort() 'ton code : mon_compte.lignes.sort()
Ensuite ben il veux rien savoir puisqu'il ne peut trier qu'une dimension
'source : http://msdn.microsoft.com/fr-fr/library/w56d4y5z(VS.85).aspx Imports System Imports System.Collections.Generic Public Class Example Private Shared Function CompareDinosByLength( _ ByVal x As String, ByVal y As String) As Integer If x Is Nothing Then If y Is Nothing Then ' If x is Nothing and y is Nothing, they're ' equal. Return 0 Else ' If x is Nothing and y is not Nothing, y ' is greater. Return -1 End If Else ' If x is not Nothing... ' If y Is Nothing Then ' ...and y is Nothing, x is greater. Return 1 Else ' ...and y is not Nothing, compare the ' lengths of the two strings. ' Dim retval As Integer = _ x.Length.CompareTo(y.Length) If retval <> 0 Then ' If the strings are not of equal length, ' the longer string is greater. ' Return retval Else ' If the strings are of equal length, ' sort them with ordinary string comparison. ' Return x.CompareTo(y) End If End If End If End Function Public Shared Sub Main() Dim dinosaurs As New List(Of String) dinosaurs.Add("Pachycephalosaurus") dinosaurs.Add("Amargasaurus") dinosaurs.Add("") dinosaurs.Add(Nothing) dinosaurs.Add("Mamenchisaurus") dinosaurs.Add("Deinonychus") Display(dinosaurs) Console.WriteLine(vbLf & "Sort with generic Comparison(Of String) delegate:") dinosaurs.Sort(AddressOf CompareDinosByLength) Display(dinosaurs) End Sub Private Shared Sub Display(ByVal lis As List(Of String)) Console.WriteLine() For Each s As String In lis If s Is Nothing Then Console.WriteLine("(Nothing)") Else Console.WriteLine("""{0}""", s) End If Next End Sub End Class ' This code example produces the following output: ' '"Pachycephalosaurus" '"Amargasaurus" '"" '(Nothing) '"Mamenchisaurus" '"Deinonychus" ' 'Sort with generic Comparison(Of String) delegate: ' '(Nothing) '"" '"Deinonychus" '"Amargasaurus" '"Mamenchisaurus" '"Pachycephalosaurus"
avant je gérais tout via la listview (grave erreur car ce n'est qu'une visualisation, d'où la refonte compléte du code, sujet de ce post^^ )
-ton test de double ligne lors du chargement.... il sert à quoi?
-ouverture d'un fichier existant => depuis une SAVEBOX ?
-.SAVE juste après le OPEN? pourquoi
-etc...
je suis obligé de trier la class et pas la listview, car sinon si je clic sur la listview pour pointer une ligne ou la dupliquer cela ne sera pas la bonne ligne de ma class (la listview est certe une visu, mais c'est aussi et surtout l'IHM de mon appli ;) )
Public ID As System.Guid = System.Guid.NewGuid 'ID unique (attention aux .Clone!!)
Public Function GetItemByGuid(ByVal sGuid As String) As Integer If Me.Items.Count > 0 Then For i As Integer = 0 To Me.Items.Count - 1 If Me.Items(i).ID.Equals(New System.Guid(sGuid)) Then Return i Next End If Return -1 End Function
Private Sub tsmDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsmDelete.Click Dim pos1 As Integer = ListView1.SelectedItems.Item(0).Index Dim pos2 As Integer = CurrentAccount.GetItemByGuid(ListView1.SelectedItems.Item(0).Text) If MessageBox.Show("Êtes-vous sûr de vouloir supprimer cet élément", "Suppression définitive!", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.Yes Then CurrentAccount.Items.RemoveAt(pos2) ListView1.Items.RemoveAt(pos1) CurrentAccount.Save() End If End Sub
Imports System Imports System.Collections.Generic Public Class CLS_trie_lignes Implements IComparer(Of CLS_lignes) Public Function CompareByDate(ByVal x As CLS_lignes, ByVal y As CLS_lignes) As Integer _ Implements System.Collections.Generic.IComparer(Of CLS_lignes).Compare ' compare les dates et retourne un integer pour le manager de la fonction (transparent) If x.L_date > y.L_date Then Return -1 ElseIf x.L_date = y.L_date Then Return 0 Else Return 1 End If End Function End Class
Public Sub trie() Dim MonTrie As New CLS_trie_lignes Me.lignes.Sort(MonTrie) End Sub
' trie mon_compte avant mon_compte.trie()