9 votes

Lier un DataGrid WPF à une DataTable

Je ne suis pas bon en anglais parce que je ne suis pas un locuteur natif. Je m'excuse si j'ai fait des erreurs dans la langue :)

Je suis novice en C# et WPF et j'essaie de lier une DataGrid WPF à une DataTable en TwoWay. Maintenant, lorsque je modifie les valeurs dans la DataGrid, les données dans la DataTable changent correctement. Lorsque j'essaie de remplir le DataTable avec le code suivant :

OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection));
adapter.Fill(dataTable);

le code fonctionne et le DataGrid semble correct. Mais lorsque j'essaie ceci :

dataTable.Rows[0][1] = (some object);

la valeur affichée ne change pas. J'essaie de vérifier les valeurs dans le DataGrid de la manière suivante :

MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString());

et il s'avère qu'il n'y a aucun problème. Je me demande pourquoi les valeurs d'affichage sont comme ça.

Voici mon DataGrid.CellStyle en XAML :

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridCell">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{TemplateBinding Background}">
                        <DataGridDetailsPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" Content="{TemplateBinding Content}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <!-- triggers -->
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

Je suis bloqué sur ce problème depuis plusieurs jours. Merci pour toute aide !

6voto

blindmeis Points 10881

Cela fonctionne, mais vous pouvez peut-être donner plus d'informations.

modèle de vue :

public DataTable MyDataTable { get; private set; }

//ctor
_ds = new DataSet("Test");
this.MyDataTable = _ds.Tables.Add("DT");
this.MyDataTable.Columns.Add("First");
this.MyDataTable.Columns.Add("Second");

this.MyDataTable.Rows.Add("11", "12");
this.MyDataTable.Rows.Add("21", "22");

//view is updated with this
public void UpdateTable()
{
    this.MyDataTable.Rows[0][1] = "haha";
}

xaml

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/>

6voto

samar Points 2182

Je ne suis pas très sûr que cette solution fonctionnera, mais elle vaut la peine d'être essayée.

Au lieu de lier votre DataGrid à un DataTable essayez de le lier à un DataView . Vous pouvez convertir votre DataTable à un DataView en utilisant DefaultView comme

DataTable dt = new DataTable();
DataView dv = dt.DefaultView;

Sur la liaison avec DataView votre notification des changements de données doit fonctionner dans les deux sens.

2voto

Brian S Points 2946

Malheureusement, je ne crois pas que le DataRow met en œuvre INotifyPropertyChanged ou le DataTable met en œuvre INotifyCollectionChanged . Ce sont les interfaces qui indiquent à un WPF DataBinding à mettre à jour lorsque la valeur de la source sous-jacente change. Ainsi, lorsque vous mettez à jour la valeur sous-jacente DataTable les valeurs Binding n'est pas automatiquement actualisé et le changement ne sera pas reflété dans votre DataGrid .

Ce lien pointe vers une question similaire et fournit une réponse. En gros, si vous voulez que votre DataGrid pour qu'il reconnaisse et mette à jour les valeurs modifiées dans la source de données sous-jacente, vous devrez créer un ou plusieurs objets personnalisés qui mettent en œuvre l'option INotifyPropertyChanged .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X