+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 6 su 6

ComboBox multicolonna

  1. #1
    kucaio non è in linea Novello
    Buongiorno a tutti

    mi presento sono un appassionato di visual basic adesso vb.net ho inizato ad utilizzare il WPF, suggerisco a tutti di sbirciare questa nuova tecnologia visto che ha un grandissimo potenziale, come al solito però mi trovo di fronto ai primi errori di gioventù ovvero nel caso specifico , sono riuscito a creare una combobox multicolonna in WPF scrivento in codice XAML il seguente codice:

    <ComboBox Grid.Column="2" Grid.Row="1"  ToolTip="Inserisci il tuo nome"  Name="CmbUserName" Margin="0,0,0,26">
                <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Nome}" Width="100" />
                        <TextBlock Text="{Binding Cognome}" Width="100" />
                    </StackPanel>
                </DataTemplate>
                </ComboBox.ItemTemplate>
    
    
                </ComboBox>
    

    La colonna preleva i dati da un dataset, esattamente dalla colonna nome e cognome.

    Il primo primo questito è;
    Come posso caricare i valori nelle colonne del combobox utilizzando in code behind ?
    nel caso di colonna singola uso il seguete codice:
    CmbUserName.Items.Add(MyArray(i))
    
    che nel caso di doppia colonna non funziona
    il secondo questi è:

    come faccio a leggere il valore selezionato visto che il seguente codice in caso di doppia colonna sul combobox non funziona.

     Dim a =  CmbUserName.SelectedValue
    
    Grazie a tutti per la collaborazione.
    Ultima modifica di AntonioG; 22-02-2013 14:08 

  2. #2
    Gidisoft non è in linea Scolaretto
    Ciao,

    di primo acchitto ti dico che wpf e dotnet stanno agli antipodi tra loro. Direi come guidare sulle rotaie oppure avere un veloce coupe.
    Si, sulle rotaie puoi anche appisolarti, talvolta, per il resto fai tu
    Io , per permettermi qualche pisolino, mi sono fatto estensioni classi e controlli utente.
    Questo sotto è un esempio.

        <Extension()> _
         Sub BindToSql(ByVal ComboBox As ComboBox, _
               ByVal StrSql As String, _
               Optional ByVal ValueMember As String = "", _
               Optional ByVal DisplayMember As String = "", Optional ByVal FirstEmptyItem As Boolean = False)
    
            '== Datatable
            Dim objDapCtl As New SqlDataAdapter
            Dim Dtb As New DataTable
            Try
                Dtb = fGetDtbSql(StrSql, "Combo", objDapCtl)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    
            If Dtb.Rows.Count = 0 Then
                Exit Sub
            End If
    
            If Not FirstEmptyItem Then
    
    
            Else
    
                Try ' Aggiunta record vuoto
                    '== Non serve, basta mettere Datasource.load dopo caricamento Combo!
                    Dim CmbRow As DataRow = Dtb.NewRow
                    If Dtb(0)(0).GetType.ToString = "System.Int32" Then
                        Dtb.Clear()
                        'CmbRow(0) = Dtb(0)(0).ToString()
                        'CmbRow(1) = Dtb(0)(1).ToString()
                        CmbRow(0) = 0
                        CmbRow(1) = "---------"
                    Else
                        Dtb.Clear()
                        CmbRow(0) = "    "
                        CmbRow(1) = "         "
                    End If
                    wl(CmbRow(0))
                    Dtb.Rows.Add(CmbRow)
                    DtbAddtoDtb(Dtb, fGetDtbSql(StrSql))
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
                ' '' ''Try ' Ordinamento righe
                ' '' ''    Dim MyDr() As DataRow
                ' '' ''    Dim strSort As String = Dtb.Columns(1).ColumnName
                ' '' ''    MyDr = Dtb.Select("", strSort)
    
                ' '' ''    Dtb = MyDr.CopyToDataTable
                ' '' ''Catch ex As Exception
                ' '' ''    wl(ex.Message)
                ' '' ''End Try
            End If
    
            '== ComboBox
            Try
                ComboBox.DataSource = Dtb
                If ValueMember = "" Then
                    ComboBox.ValueMember = Dtb.Columns(0).ColumnName
                    ComboBox.DisplayMember = Dtb.Columns(1).ColumnName
                Else
                    ComboBox.ValueMember = ValueMember
                    ComboBox.DisplayMember = DisplayMember
                End If
    
                'ComboBox.SelectedValue = 
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                'Dtb = Nothing
            End Try
        End Sub
    

  3. #3
    L'avatar di Cteniza
    Cteniza non è in linea Amanuense
    Quando tu aggiungi o leggi dei valori che derivano dal databinding devi agire sul repository locale e per mezzo del binding verrà aggiunta una nuova riga che vedrai apparire nella tua combo.
    Per leggere il valore visualizzato in quel momento puoi utilizzare la proprietà selectvalue.
    ℹ️ Leggi di più su Cteniza ...

  4. #4
    Gidisoft non è in linea Scolaretto
    Quando hai 2 colonne Dim a = CmbUserName.SelectedItem(1)

  5. #5
    kucaio non è in linea Novello
    Quote Originariamente inviato da Cteniza Visualizza il messaggio
    Quando tu aggiungi o leggi dei valori che derivano dal databinding devi agire sul repository locale e per mezzo del binding verrà aggiunta una nuova riga che vedrai apparire nella tua combo.
    Per leggere il valore visualizzato in quel momento puoi utilizzare la proprietà selectvalue.
    Ciao potresti darmi ulteriori chiarimenti?

    sono ignorante in materia cosa è l' repository potresti farmi un'esempio banale banale?

    Grazie

  6. #6
    L'avatar di Cteniza
    Cteniza non è in linea Amanuense
    Con una colonna sola tutta l'operazione è automatica.
    Purtroppo avendo invece un combo personalmente mi orienterei per "ereditare" il controllo e impostare il valore del campo utilizzando una nuova proprietà (bisogna ricordarsi) che ad ogni lettura / scrittura del datarow è necessario impostare due valori sulla colonna o scrivere due valori sulla colonna.
    Forse modificando l'origine dati locale (dataset) aggiungendo una colonna "calcolata" che contiene le due colonne raccolte insieme che dovranno poi essere "bindate" nel combo.
    in ogni caso dovresti "ereditare" il controllo per agire sull'evento onpaint del controllo in maniera che le due colonne abbiano un separatore "normale" che lo spazio occupato da ciascuna contenga la colonna singola "misurata" secondo lo spazio disponibile.
    ℹ️ Leggi di più su Cteniza ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Edit casella di riepilogo alias combobox - multicolonna
    Da ultimacorsa nel forum Microsoft Access
    Risposte: 7
    Ultimo Post: 18-05-2018, 23:51
  2. Casella combinata multicolonna
    Da eldatichiant nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 25-05-2015, 21:30
  3. ComboBox Unicode Multicolonna per Vb6
    Da Mapi60 nel forum Altri linguaggi e strumenti
    Risposte: 4
    Ultimo Post: 07-01-2009, 17:18
  4. CheckedListBox multicolonna
    Da hetabeta nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 25-07-2008, 12:48
  5. ALTER COLUMN multicolonna !!!
    Da me1048 nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 05-05-2008, 11:20