Un tableau de variables (et non pas de leurs valeurs)
Bonjour à tous,
Voilà. J'ai besoin de mettre dans un tableau toute une liste de variables, et non pas de leurs valeurs. Par exemple, les variables sont toujours : Var1, Var2, Var3... Var250 . En fonction de l'utilisateur, la combobox qui est générée dynamiquement avec le tableau affiche, elle, les valeurs des variables.
Je m'explique :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
CasUtilisateur = 12 'utilisateur de légumes
Select Case CasUtilisateur
Case1
ValeursVariables(1)
Case 2
ValeursVariables(2)
.......
End Select
For i =0 to ubound(Tabl)
Combo1.Items.Add( Tabl(i))
Next
'Puis le sub
Private sub ValeursVariables(ByVal Niv as integer)
Select case Niv
...
Case is = 12
Var1 = "Courgettes"
Var2 = "Poireaux"
...........................
end sub
'donne, à la lecture du combo, à l'index 0, par ex. "Courgettes"
'Je veux, ne serait-ce que pour apprendre, charger un tableau de variable. |
Pour l'instant, mon combo charge "Var1, Var2, Var3....
Et j'aurais aimé "Courgettes et poireaux...
Bien sûr je pourrais prévoir, dès l'ouverture de l'application, de charger 40, 80 ou 200 tableaux. Il y a aussi la solution d'écrire, le nombre de fois nécessaires, le code de génération du combobox et ensuite de faire un Select.
Mais tout cela me paraît pas très sérieux. Par contre, les listes ou dictionnaires... J'avoue nager un peu de ce côté. Peut-être qu'il y aurait une ouverture ? Si quelqu'un maîtrise ces outils...
Pour une idée, je serai assez preneur...
Merci d'avance.
country culture, pays & image flags
bonjour Whombat
l'idee de stocker les noms des variables en resources me parait un peu bizarre et peu courante comme facon de programmer.A moins que tu confondes entre variables et valeurs des variables.
Elle est à abandonner crois-moi.
Ce qui preocuppe d'habitude les programmeurs,c'est plutot stocker les valeurs des variables en resources oui......
De ce qui ressort de ta discussion avec AsmDuty ,l'objectif de ton appli est de gerer une liste de pays,culture-langue and flags.
Je me pose la question pourquoi tu n'utilises pas l'infrastructure .Net Framework existante relative à la localisation des appli..tout simplement.
Il suffit de lui rajouter en resources tes images ou icones drapeaux
1er code exemple ; un controle ListView synchronise avec un controle Combox+2 controles ImageList à charger avec tes flags en resources sur le designer VS directement...(tri du listview et du combox ne peuvent etre synchronises et sont desactives):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
Imports System.Threading
Imports System.Globalization
Imports System.Windows.Forms
Public Class Form1
Private MyListCI As List(Of CultureInfo) = New List(Of CultureInfo)
Private Sub btnFillCombo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFillCombo.Click
'Ajout des valeurs aux ComboBox et ListView POMPEES DE CultureInfo(gratis)
SetupListViewAndComboBox()
End Sub
Private Sub ComboLanguages_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboLanguages.SelectedIndexChanged
If Me.ComboLanguages.SelectedIndex = -1 Then Return
Dim ndxCountrySel As Integer = Me.ComboLanguages.SelectedIndex
Me.ListViewLanguages.Focus()
Me.ListViewLanguages.Items(ndxCountrySel).Selected = True
Me.ListViewLanguages.Items(ndxCountrySel).Checked = True
Me.ListViewLanguages.Items(ndxCountrySel).EnsureVisible()
End Sub
Private Sub SetupListViewAndComboBox()
'MISE EN FORME du ComboBox
' Tri : à eviter car la synchronisation des controles ListView et ComboBox sera perdues
Me.ComboLanguages.Sorted = False
'MISE EN FORME du ListView
' Set the view to show details.
ListViewLanguages.View = View.Details
' Allow the user to edit item text.
ListViewLanguages.LabelEdit = False
' Allow the user to rearrange columns.
ListViewLanguages.AllowColumnReorder = False
' Display check boxes.
ListViewLanguages.CheckBoxes = True
' Select the item and subitems when selection is made.
ListViewLanguages.FullRowSelect = True
' Display grid lines.
ListViewLanguages.GridLines = True
' Tri : à eviter car la synchronisation des controles ListView et ComboBox sera perdues
ListViewLanguages.Sorting = SortOrder.None
'AJOUT DES EN-TETES COLONNES
' Create columns for the items and subitems.
Me.ListViewLanguages.Columns.Add("CountryCulture&NameFlags", 32, HorizontalAlignment.Left)
Me.ListViewLanguages.Columns.Add("IsoName", 100, HorizontalAlignment.Left)
Me.ListViewLanguages.Columns.Add("EnglishName", 100, HorizontalAlignment.Center)
'AJOUT DES VALEURS POMPEES DE CultureInfo(gratis)
For Each ci As CultureInfo In CultureInfo.GetCultures(CultureTypes.AllCultures)
MyListCI.Add(ci)
Next
'AJOUT DES VALEURS DE MyListCI A ListView
Dim myItem As ListViewItem
For Each ci As CultureInfo In MyListCI
'ajout dans ComboBox
Me.ComboLanguages.Items.Add(ci.EnglishName)
'ajout dans ListView
myItem = New ListViewItem(ci.DisplayName, 0)
myItem.Checked = False
myItem.SubItems.Add(ci.Name)
myItem.SubItems.Add(ci.EnglishName)
Me.ListViewLanguages.Items.Add(myItem)
Next
'AJOUT DES BANNIERES AU CONTROLES ImageList SUR DESIGNER
'(NB:les bannieres seront d'office integres dans les resources du Form)
'AJOUTES 2 CONTROLES ImageList DANS LE FORM.
' Initialize the ImageList objects with bitmaps.
'Assign the ImageList objects to the ListView.
Me.ListViewLanguages.LargeImageList = imageListLarge
Me.ListViewLanguages.SmallImageList = imageListSmall
' Tri : à eviter car la synchronisation des controles ListView et ComboBox sera perdues
End Sub
Private Sub rdBtnDetail_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdBtnDetail.CheckedChanged
Me.ListViewLanguages.View = View.Details
End Sub
Private Sub rdBtnSmall_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdBtnSmall.CheckedChanged
Me.ListViewLanguages.View = View.SmallIcon
End Sub
Private Sub rdBtnLarge_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rdBtnLarge.CheckedChanged
Me.ListViewLanguages.View = View.LargeIcon
End Sub
End Class |
2er code exemple : un DataGridView plus maniable synchronise avec un Combox+1 seul controle ImageList à charger avec tes flags en resources sur le designer VS directement...(...( le DataGridView permet de trier n'importe quelle colonne):
Variante 1:datagridview rempli integralement à partir de notre liste des cultures MyListCI (provient de table .Net Framework CultureInfo.GetCultures)+un ImageList a remplir avec tes flags en correspondante de MyListCI.....
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
Imports System.Threading
Imports System.Globalization
Imports System.Windows.Forms
Public Class frmWhomBatVar1
Private MyListCI As List(Of CultureInfo) = New List(Of CultureInfo)
Private Sub btnFillCombo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFillCombo.Click
'Appel à variante 1
SetupDataGridViewAndComboBox()
End Sub
'Variante 1: ajout Auto toutes colonnes de la liste MyListCI
'à DataGridView grace à sa prop: DataSource
Private Sub SetupDataGridViewAndComboBox()
'AJOUT DES VALEURS POMPEES DE CultureInfo(gratis) à MyListCI
For Each ci As CultureInfo In CultureInfo.GetCultures(CultureTypes.AllCultures)
MyListCI.Add(ci)
Next
'Clear the ComboLanguages control
Me.ComboLanguages.DataSource = MyListCI
'Clear the DataGridViewLanguages control
DataGridViewLanguages.DataSource = Nothing
'Presentation Colonnes Lignes:En-tete non visible
Me.DataGridViewLanguages.RowHeadersVisible = False
' Disable editing features.
DataGridViewLanguages.AllowUserToAddRows = False
DataGridViewLanguages.AllowUserToDeleteRows = False
DataGridViewLanguages.EditMode = DataGridViewEditMode.EditProgrammatically
'Presentation Colonnes
DataGridViewLanguages.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.ForeColor = Color.Blue
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True
'Auto-generation des colonnes moins colonnes NumberFormat & DateTimeFormat
'avec Remove on peut exclure certaines colonnes de la generation
'ici:ces 2 colonnes generes une exception en realtion avec culture -ar-
'c'est une autre facon de personnaliser au passage moins souple.
With Me.DataGridViewLanguages
.AutoGenerateColumns = True
.DataSource = MyListCI
.Columns.Remove("NumberFormat")
.Columns.Remove("DateTimeFormat")
End With
'Ajoute une colonne image(necessite un code)
CreateColumns()
'AJOUT DES BANNIERES A L'UNIQUE CONTROLE ImageList SUR DESIGNER
'AJOUTES 1 CONTROLE ImageList DANS LE FORM.
'(NB:les bannieres seront d'office integres dans les resources du Form)
''Assign images from Resources to ImageList.
'Assign the ImageList objects to DataGridView.
'le nombre d'images dans ImageList doit etre egal à =>nbRows
'en d'autres termes :ImageList1.Images.Count=DataGridViewLanguages.Rows.Count
Dim nbRows As Integer = Me.DataGridViewLanguages.Rows.Count - 1
Dim numLastCol = Me.DataGridViewLanguages.Columns.Count - 1
For i = 0 To nbRows
Me.DataGridViewLanguages.Rows(i).Cells(numLastCol).Value = Me.ImageList1.Images.Item(i)
Next
' Tri :le tri est facile dans DataGridView
End Sub
Private Sub CreateColumns()
Dim imageColumn As DataGridViewImageColumn
Dim columnCount As Integer = 0
Dim bitmapPadding As Integer = 6
Do
Dim unMarked As Bitmap = My.Resources.Flag
imageColumn = New DataGridViewImageColumn()
' Add twice the padding for the left and
' right sides of the cell.
imageColumn.Width = unMarked.Width + 2 * bitmapPadding + 1
imageColumn.Image = unMarked
imageColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
imageColumn.HeaderText = "My Flags"
imageColumn.ImageLayout = DataGridViewImageCellLayout.Stretch
imageColumn.Description = "default image layout"
DataGridViewLanguages.Columns.Add(imageColumn)
columnCount = columnCount + 1
Loop While columnCount < 1
End Sub
End Class |
variante 2 : datagridview ou l'on ajoute que les colonnes souhaitees (personnalisees) à partir de notre liste des cultures MyListCI+un ImageList a remplir avec tes flags en correspondante de MyListCI.....
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
Imports System.Threading
Imports System.Globalization
Imports System.Windows.Forms
Public Class frmWhomBatVar2
Private MyListCI As List(Of CultureInfo) = New List(Of CultureInfo)
Private Sub btnFillCombo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFillCombo.Click
'Appel à variante 2.
'SetupDataGridViewAndComboBoxPerso()
End Sub
'Variante 2: ajout personnalise des colonnes souhaitees
'seulement de la liste MyListCI par code.
Private Sub SetupDataGridViewAndComboBoxPerso()
'AJOUT DES VALEURS POMPEES DE CultureInfo(gratis) à MyListCI
For Each ci As CultureInfo In CultureInfo.GetCultures(CultureTypes.AllCultures)
MyListCI.Add(ci)
Next
'Clear the ComboLanguages control
Me.ComboLanguages.DataSource = MyListCI
'Clear the DataGridViewLanguages control
DataGridViewLanguages.DataSource = Nothing
'Presentation Colonnes Lignes:En-tete non visible
Me.DataGridViewLanguages.RowHeadersVisible = False
' Disable editing features.
DataGridViewLanguages.AllowUserToAddRows = False
DataGridViewLanguages.AllowUserToDeleteRows = False
DataGridViewLanguages.EditMode = DataGridViewEditMode.EditProgrammatically
'Presentation Colonnes
DataGridViewLanguages.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.ForeColor = Color.Blue
DataGridViewLanguages.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True
'Ajout des colonnes souhaitees
' The easiest way to add a column, with name and header text.
'on prend comme modele la 1ere ligne de MyListCI(peut importe la ligne)
Dim ciModele As CultureInfo = Me.MyListCI.Item(0)
DataGridViewLanguages.Columns.Add(ciModele.DisplayName, "Culture DisplayName")
DataGridViewLanguages.Columns(ciModele.DisplayName).ValueType = GetType(String)
DataGridViewLanguages.Columns.Add(ciModele.Name, "ISO Name")
DataGridViewLanguages.Columns(ciModele.Name).ValueType = GetType(String)
DataGridViewLanguages.Columns.Add(ciModele.EnglishName, "EnglishName")
DataGridViewLanguages.Columns(ciModele.EnglishName).ValueType = GetType(String)
DataGridViewLanguages.Columns.Add(ciModele.Parent.DisplayName, "Culture Parent Name")
DataGridViewLanguages.Columns(ciModele.Parent.DisplayName).ValueType = GetType(String)
'Ajoute une colonne image
CreateColumns()
'Ajout des lignes par code
For Each ci As CultureInfo In MyListCI
' Fill in a row of data (as a list of values).
DataGridViewLanguages.Rows.Add(ci.DisplayName, ci.Name, _
ci.EnglishName, ci.Parent.DisplayName)
Next
'AJOUT DES BANNIERES QU'IL TE REVIENT DE STOCKER DANS RESOURCES
'AJOUTES 2 CONTROLES ImageList DANS LE FORM.
'(NB:les bannieres seront d'office integres dans les resources du Form)
'Assign images from Resources to ImageList.
'Assign the ImageList objects to DataGridView.
'le nombre d'images dans ImageList doit etre egal à =>nbRows
'en d'autres termes :ImageList1.Images.Count=DataGridViewLanguages.Rows.Count
Dim nbRows As Integer = Me.DataGridViewLanguages.Rows.Count - 1
Dim numLastCol = Me.DataGridViewLanguages.Columns.Count - 1
For i = 0 To nbRows
Me.DataGridViewLanguages.Rows(i).Cells(numLastCol).Value = Me.ImageList1.Images.Item(i)
Next
' Tri :le tri est facile dans DataGridView
End Sub
Private Sub CreateColumns()
Dim imageColumn As DataGridViewImageColumn
Dim columnCount As Integer = 0
Dim bitmapPadding As Integer = 6
Do
Dim unMarked As Bitmap = My.Resources.Flag
imageColumn = New DataGridViewImageColumn()
' Add twice the padding for the left and
' right sides of the cell.
imageColumn.Width = unMarked.Width + 2 * bitmapPadding + 1
imageColumn.Image = unMarked
imageColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
imageColumn.HeaderText = "My Flags"
imageColumn.ImageLayout = DataGridViewImageCellLayout.Stretch
imageColumn.Description = "default image layout"
DataGridViewLanguages.Columns.Add(imageColumn)
columnCount = columnCount + 1
Loop While columnCount < 1
End Sub
End Class |
bon code...........