locked
datagrid valore nella colonna [i] RRS feed

  • Domanda

  • Ciao a tutti, è il primo messaggio che scrivo, perchè la prima volta che non trovo la soluzione al mio problema in questo forum.

     

    io ho questo codice nella mia pagina.xaml:

     

     

     <Grid ShowGridLines="True" UseLayoutRounding="True" Height="Auto" Name="gridAttivita" Margin="5,5,5,5" >
        <datagrid:DataGrid x:Name="dataGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="False" ColumnWidth="Auto">
         <data:DataGrid.Columns>
          <data:DataGridTemplateColumn Width="100" Header="Iscrizione">
           <data:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
             <CheckBox Content="Iscrivimi" Checked="CheckBoxIscrivimi_Checked" Unchecked="CheckBoxIscrivimi_Unchecked" Tag="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=IdAttivita}"/>
            </DataTemplate>
           </data:DataGridTemplateColumn.CellTemplate>
          </data:DataGridTemplateColumn>
          <data:DataGridTextColumn Header="Nome Attivita" CanUserSort="True" CanUserReorder="True" CanUserResize="True" SortMemberPath="NomeAttivita" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=NomeAttivita}" Width="150" />
          <data:DataGridTextColumn Header="Costo (€)" CanUserSort="True" CanUserReorder="True" CanUserResize="True" SortMemberPath="Costo" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=Costo}"/>
          <data:DataGridTextColumn Header="Numero Uscite" CanUserSort="True" CanUserReorder="True" CanUserResize="True" SortMemberPath="NumeroUscite" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=NumeroUscite}"/>
          <data:DataGridTextColumn Header="Numero Partecipanti" CanUserSort="True" CanUserReorder="True" CanUserResize="True" SortMemberPath="NumeroPartecipanti" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=NumeroPartecipanti}" Visibility="Collapsed"/>
          <data:DataGridTextColumn Header="Descrizione" CanUserSort="True" SortMemberPath="Descrizione" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=Descrizione}" Visibility="Visible"/>
          <data:DataGridTextColumn Header="IdAttivita" CanUserSort="True" SortMemberPath="IdAttivita" 
               Binding="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=IdAttivita}" Visibility="Collapsed"/>
          <data:DataGridTemplateColumn Width="170" Header="Seleziona la Fermata">
           <data:DataGridTemplateColumn.CellTemplate>        
            <DataTemplate>
             <ComboBox ItemsSource="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=lstFermate}" SelectedItem="{Binding Path=IdFermata}" DisplayMemberPath="Indirizzo" SelectionChanged="ComboBox_SelectionChanged" />                 
            </DataTemplate>        
           </data:DataGridTemplateColumn.CellTemplate>      
          </data:DataGridTemplateColumn>
          <data:DataGridTemplateColumn Width="170" Header="Ogni uscita una fermata diversa">
           <data:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>         
             <CheckBox Content="Uguale per tutte le uscite" IsChecked="True" Name="ChkBoxStessaFermata" Checked="ChkBoxStessaFermata_Checked" Unchecked="ChkBoxStessaFermata_Unchecked" Tag="{Binding Converter={StaticResource RowIndexConverter},
               ConverterParameter=IdAttivita}" />
            </DataTemplate>
           </data:DataGridTemplateColumn.CellTemplate>
          </data:DataGridTemplateColumn>
         </data:DataGrid.Columns>
        </datagrid:DataGrid>
       </Grid>
    

     

     

     

    nell'evento legatoal combobox ComboBox_SelectionChanged ho questo:

     

     

     

     private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {
       ComboBox locCombo = (ComboBox)sender;
    
       int idFermata = 0;
       int.TryParse(locCombo.SelectedItem.ToString(), out idFermata);    
    
      }
    

     

     

     

    Avrei bisogno però di recuperarmi anche l'IdAttività che sta nella colonna IdAttivita. Come posso dirgli ad esempio di prendermi il valore nella stessa riga del combobox selezionato ma nella colonna IdAttivita?? (oppure nella colonna 5) ?

     

    grazie mille a tutti

    giovedì 15 luglio 2010 07:40

Risposte

  • GetCellContent

    vb:

     

    MessageBox.Show(DirectCast(Me.DataGrid.Columns(0).GetCellContent(Me.DataGrid.SelectedItem), CheckBox).IsEnabled.ToString)

    c#(?):MessageBox.Show(((CheckBox)this.DataGrid.Columns(0).GetCellContent(this.DataGrid.SelectedItem)).IsEnabled.ToString)

    • Contrassegnato come risposta benetz lunedì 19 luglio 2010 12:47
    lunedì 19 luglio 2010 12:02

Tutte le risposte

  • non so se ho capito,

    perchè non fai il cast del DataGrid.SelectedItem alla tuo tipo di orgine dati ?

    DirectCast(Me.DataGrigd.SelectedItem,MyColl).IdAttività

     

    giovedì 15 luglio 2010 13:57
  • Mi dispiace, programmo in silverlight da poco tempo.. non ho idea di cosa sia id DirectCast, e mi da errore se lo inserisco così..non me lo risolve nemmeno..

     

    come funziona? e il Me.DataGrid? cos'è il Me?

    giovedì 15 luglio 2010 14:35
  • Intende dire qualcosa tipo:

    MyColl myColl=(MyColl)this.DataGridg.SelectedItem;
    

    e poi utilizzi myColl per leggere le info.


    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    giovedì 15 luglio 2010 17:23
    Postatore
  • Si ma this.DataGridg.SelectedItem mi restituisce un oggetto di tipo Row (o DataGridRow) oppure il Combobox da me selezionato? perchè a me interesserebbe avere l'ogetto Riga.

     

    comunque considerando l'oggetto MyColl come oggetto riga poi dovrei prelevarmi il valore nella cella 4 ad esempio con MyColl.Cell[4] , giusto?

    giovedì 15 luglio 2010 17:28
  • credo che corrado intenda qualcosa de genere:

    supponiamo te metta nella tua DataGrid degli oggetti di tipo Person con 3 attributi: Nome,Cognome ed Età

    facendo:

    Person myPerson = (Person)this.dataGrid.SelectedItem; //dataGrid è il nome che hai dato alla tua DataGrid

    a questo punto potrai ottenere i valori lavorando sul myPerson. per esempio per ottenere il nome ti servirà fare: myPerson.Nome.

    spero di esserti stato d'aiuto

    Alessio

    giovedì 15 luglio 2010 18:13
  • ok, provo subito. Grazie mille.
    venerdì 16 luglio 2010 06:50
  • perfetto funziona, però riesco a ricavarmi solo le colonne assegnate in binding.. c'è un modo per ricavare anche le "DataGridTemplateColumn"??

     

     

    nel mio caso il datagrid lo carico così:

     

         

        List<Row> lstRighe = new List<Row>();
    
          foreach (ClsAttivita locAttivita in e.Result)
    
          {       
    
            Row row = new Row();
    
            row["NomeAttivita"] = locAttivita.NomeAttivita;
    
            row["Costo"] = locAttivita.Costo;
    
            row["NumeroUscite"] = locAttivita.NumeroUscite;
    
            row["NumeroPartecipanti"] = locAttivita.NumeroPersone;
    
            row["Descrizione"] = locAttivita.Descrizione;
    
            row["IdAttivita"] = locAttivita.IdAttivita;       
    
            row["lstFermate"] = locAttivita.listaFermate;
    
            lstRighe.Add(row);
    
          }
    
    
    
          dataGrid.ItemsSource = lstRighe;
    

     

    e quindi per ricavarmi l'idAttivita di prima faccio così:

     

    Row row = (Row)this.dataGrid.SelectedItem;
    long idAttivita = 0;
    long.TryParse(row["IdAttivita"].ToString(), out idAttivita);
    

     

    però se volessi ricavarmi il valore della colonna Iscrivimi?

    è stata dichiarata così:

     

    <data:DataGridTemplateColumn Width="100" Header="Iscrizione">
        <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
         <CheckBox Content="Iscrivimi" Checked="CheckBoxIscrivimi_Checked" Unchecked="CheckBoxIscrivimi_Unchecked" Tag="{Binding Converter={StaticResource RowIndexConverter},
          ConverterParameter=IdAttivita}"/>
        </DataTemplate>
        </data:DataGridTemplateColumn.CellTemplate>
       </data:DataGridTemplateColumn>

     

    mi servirebbe una sorta di DataGridRow locRiga = this.DataGrid.SelectRow; //che mi restituisca la riga del datagrid, non del ItemsSource

    per poi fare locRiga[0].value;

     

    il problema è che convertendo il this.DataGrid.SelectedItem mi restituisce una variabile di tipo Row, che non contiene il mio iscrivimi.

     

    spero di essermi spiegato, altrimenti ditemi cosa non è chiaro.

    venerdì 16 luglio 2010 07:19
  • mi potresti dire il senso logico di questa parte di xaml ?

        <DataTemplate>
         <CheckBox Content="Iscrivimi" Checked="CheckBoxIscrivimi_Checked" Unchecked="CheckBoxIscrivimi_Unchecked" Tag="{Binding Converter={StaticResource RowIndexConverter},
          ConverterParameter=IdAttivita}"/>
        </DataTemplate>

     

    poi prova a guardare qui:

    http://justgeeks.blogspot.com/2009/08/getting-selected-row-in-silverlight.html

    ciao

    lunedì 19 luglio 2010 07:10
  • beh, semplicemente in una colonna trovo un CheckBox, con scritto "Iscrivimi", e nel suo Tag trovo l'idAttivita della riga (in modo da ricavarmelo quando lo seleziono (questo è sempre dovuto al fatto che non so come prendere il valori di altre celle nella stessa riga)).

     

    cmq grazie per il link, ora vedo se riesco a farlo funzionare nel mio caso.. :)

    lunedì 19 luglio 2010 08:46
  •  per quanto riguarda il link c'è un problema:

     

    Button btn = sender as Button;  
    var entity = btn.DataContext as MyApp.Entities.MyEntity;
    MyDataGrid.SelectedItem = entity;

    qui si prevede che la cella (nel caso il bottone) sia legato all'entity, che è una tabella in Linq, giusto?

    nel mio caso però il

    <CheckBox Content="Iscrivimi" Checked="CheckBoxIscrivimi_Checked" Unchecked="CheckBoxIscrivimi_Unchecked" Tag="{Binding Converter={StaticResource RowIndexConverter},

    non è legato a nessuna tabella, è un CheckBox che attivo/disattivo io a mano... e io voglio prendermi da codice se è ceccatto oppure no.

    lunedì 19 luglio 2010 08:50
  • GetCellContent

    vb:

     

    MessageBox.Show(DirectCast(Me.DataGrid.Columns(0).GetCellContent(Me.DataGrid.SelectedItem), CheckBox).IsEnabled.ToString)

    c#(?):MessageBox.Show(((CheckBox)this.DataGrid.Columns(0).GetCellContent(this.DataGrid.SelectedItem)).IsEnabled.ToString)

    • Contrassegnato come risposta benetz lunedì 19 luglio 2010 12:47
    lunedì 19 luglio 2010 12:02
  • Grazie mille. era proprio quello che cercavo!
    lunedì 19 luglio 2010 12:40
  • Se questo post risponde alla tua domanda ricorda di contrassegnarlo come risposta. In questo modo aiuterai altri utenti che hanno lo stesso problema a trovare la risposta più velocemente. Grazie.
    lunedì 19 luglio 2010 12:44
  • Ciao benetz,

    Innanzitutto benvenuto nei Forum MSDN, dove spero troverai un valido supporto per ogni esigenza tecnica di programmazione e dove auspico tu possa fornire il tuo contributo per aiutare gli altri utenti che hanno necessità di assistenza.

    Ti chiedo cortesemente, in considerazione dell'ambiente tecnico in cui ci troviamo, di voler sostituire il tuo attuale Avatar con uno un pò meno aggressivo.

    Ti allego il collegamento

    Grato per la tua collaborazione ti rinnovo il mio benvenuto qui nei Forum MSDN.

    Daniel Mila


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    martedì 20 luglio 2010 09:50
  • Ho cambiato il mio avatar come richiesto.

     

    Voglio però precisare che l'immagine precedente era rivolta alla musica, ambiente che sento vicino a me almento quanto quello della programmazione, e non a contenuti aggressivi. 

     

    Spero che il nuovo avatar da me selezionato non rientri nella categoria "aggressivo", o in qualche altra categoria non consona a questo ambiuente. In tal caso provvederò a cambiarlo nuovamente.

     

    Grazie dell'attenzione.

    martedì 20 luglio 2010 10:14
  • Ciao, la musica e sempre bella.

    L'aggressività era piuttosto visuale. Questo con la chitarra è perfetto.

    Saluti e grazie.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    martedì 20 luglio 2010 11:15