84 messaggi dal 22 marzo 2012
Buongiorno Lista e ben tornati dalle ferie

Da ieri mattina mettendo mano ad un progetto abbiamo avuto bisogno di creare le colonne di un DataGrid (inserito nel XML della form).
Il DataGrid viene popolato con una DataTable (che crea a run time) effettuando il binding.
Questo DataGrid è stato posto come IsReadOnly="True" e infatti se io vado a selezionare una cella qualsiasi non permette la modifica del dato eccetto che per il controllo CheckBox che invece continua a essere editabile.
Intanto non capisco perchè questo controllo non faccia come tutti gli altri.
Ho provato le varie soluzioni che ho trovato ma non funzionano (a meno che non crei una colonna checkbox nel file XML e allora tutto funziona) e sto impazzendo da ieri.
Qualcuno può aiutarmi con un'idea su come posso fare.
Qui sotto vi inserisco il codice che utilizzo per la creazione delle colonne
        private void CreateColumns(DataGridStruct gridStruct)
        {
            DataGridTemplateColumn colTemplate = new DataGridTemplateColumn();
            DataTemplate dttTemplate = new DataTemplate();
            switch (gridStruct.TypeColl)
            {
                case WF.WFRType.Oggetto_File:
                    FrameworkElementFactory ckb = new FrameworkElementFactory(typeof(CheckBox));
                    ckb.SetBinding(CheckBox.IsCheckedProperty, new Binding(gridStruct.BindingColl));
                    gridStruct.HeadersColl = "File";
                    dttTemplate.VisualTree =  ckb;
                    break;
                default:
                    FrameworkElementFactory txt = new FrameworkElementFactory(typeof(TextBlock));
                    txt.SetBinding(TextBlock.TextProperty, new Binding(gridStruct.BindingColl));
                    dttTemplate.VisualTree = txt;
                    break;
            }
            colTemplate.CellTemplate = dttTemplate;        
            colTemplate.Header = gridStruct.HeadersColl;
            colTemplate.Width = gridStruct.WidthColl;
            colTemplate.HeaderStyle = (Style)this.FindResource("DataGridColumnHeaderC");
            colTemplate.Visibility = gridStruct.VisibleCol == true ? Visibility.Visible : Visibility.Hidden;
            colTemplate.IsReadOnly = false;
            dgMRView.Columns.Add(colTemplate);
        }


Nella speranza che qualcuno mi possa dare un aiuto invio cordiali saluti .

Perini Luca
257 messaggi dal 08 gennaio 2011
Io risolverei aggiungendo comunque la colonna lato Xaml e poi da codice gestirei la visibilità della stessa.

un esempio Xaml di DataGrid e DataGrid.Columns

<DataGrid HorizontalAlignment="Left" 
                  Height="174" 
                  Margin="10,168,0,0" 
                  VerticalAlignment="Top" 
                  Width="772">
            
            <DataGrid.Columns>
                <DataGridCheckBoxColumn x:Name="CheckColumn" 
                                        Binding="{x:Null}" 
                                        ClipboardContentBinding="{x:Null}" 
                                        Header="Col1" 
                                        Width="50*" 
                                        Visibility="Hidden" />
                
                <DataGridTextColumn Binding="{x:Null}" 
                                    ClipboardContentBinding="{x:Null}" 
                                    Header="Col2" Width="50*" 
                                    IsReadOnly="True" />
                
                <DataGridTextColumn Binding="{x:Null}" 
                                    ClipboardContentBinding="{x:Null}" 
                                    Header="Col3" 
                                    Width="50*" 
                                    IsReadOnly="True" />
                
                <DataGridTextColumn Binding="{x:Null}" 
                                    ClipboardContentBinding="{x:Null}" 
                                    Header="Col4" Width="50*" 
                                    IsReadOnly="True" />
                
            </DataGrid.Columns>
        </DataGrid>



Come puoi notare la colonna che dovresti aggiungere a run time è l'unica ad avere un nome. Ciò consente lato codice (VB/C#) di renderla visibile o meno semplicemente impostando la visibilità con una riga di codice del tipo

CheckColumn.Visibility = Visibility.Visible


Non so se ti piace come soluzione. Ciao.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.