DataGrid et de Collection Observable dans WPF
J'ai un datagrid comme ci-dessous dans mon application WPF.
<Window x:Class="MyApp.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<DataGrid x:Name="dgTest" ItemsSource="{Binding TestSource}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Width="125" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Column1}"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="500" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Column2}"></TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<Button Click="SaveButton_Click">Save</Button>
</Grid>
</Window>
Je suis de liaison en utilisant le code suivant. Maintenant, mon exigence est lorsque l'utilisateur saisit du texte dans ces zones de texte à l'intérieur de la grille de données et cliquez sur le bouton enregistrer, il doit mettre à jour la base de données. Comment puis-je y parvenir?
namespace MyApp
{
public partial class TestWindow: Window
{
private ObservableCollection<Test> _testSource
public ObservableCollection<Test> TestSource
{
get
{
return _testSource;
}
set
{
_testSource = value;
OnPropertyChanged("TestSource");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
}
}
public TestWindow()
{
InitializeComponent();
TestSource= new ObservableCollection<Test>();
string strConnString = Application.Current.Properties["connectionStr"].ToString();
SqlConnection con = new SqlConnection(strConnString);
SqlCommand cmd = new SqlCommand("SELECT Column1,Column2 FROM MyTable", con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dtTest = new DataTable();
da.Fill(dtTest);
foreach (DataRow row in dtTest)
{
Test cd = new Test();
cd.Column1 = row["Column1"].ToString();
cd.Column2 = row["Column2"].ToString();
TestSource.Add(cd);
}
this.DataContext = this;
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
//here I need to get the updated ObservableCollection, but now it is showing old data
foreach Test t in TestSource)
{
string a = t.Column1;
string b = t.Column2;
}
}
}
public class Test:
{
public string Column1{ get; set; }
public string Column2{ get; set; }
}
}
Grâce
Essayez de définir le
Bonjour Dev, êtes-vous en utilisant le pattern MVVM pour lier la DB les valeurs de la grille de données ? désolé pour la réponse tardive. Je suis en train de travailler sur cette question. merci
Mode
à votre ItemsSource de Liaison à TwoWay
.Bonjour Dev, êtes-vous en utilisant le pattern MVVM pour lier la DB les valeurs de la grille de données ? désolé pour la réponse tardive. Je suis en train de travailler sur cette question. merci
OriginalL'auteur Dev | 2013-01-07
Vous devez vous connecter pour publier un commentaire.
Lors de la création de votre propre INTERFACE utilisateur dans
DataGridTemplateColumn
(ou un customDataGrid.RowStyle
d'ailleurs), la grille de modifications de laUpdateSourceTrigger
(c'est à dire lorsque les données sous-jacentes doivent être mis à jour) sur l'ensemble de vos fixations àExplicit
si vous ne spécifiez pas de vous-même.Que la "fonctionnalité" est brièvement décrite ici: 5 Aléatoire de Pièges avec WPF DataGrid, et même si l'auteur dit ce qui se passe si oui ou non vous définissez la
UpdateSourceTrigger
vous-même, de le paramétrer vous-même, ne fait le travail (au moins dans .Net 4.0).Utilisation
LostFocus
pour imiter la valeur par défautTextBox
comportement (etPropertyChanged
surCheckBox
etc):gros plus pour moi, j'ai eu exactement ce problème et il m'a fallu deux jours pour trouver cela!!!!!
OriginalL'auteur Sphinxxx
Il ya un couple de notes que je voudrais faire.
1) Vous n'avez pas besoin d'avoir un setter sur votre TestSource de la propriété. Vous définissez cette valeur une fois, et avant de le DataContext est réglé, donc c'est inutile.
2) Vous n'avez pas implémenter INotifyPropertyChanged sur la classe de Test
3) Vous chargez les données sur le thread d'INTERFACE utilisateur. Cela peut provoquer un blocage de l'Application (ne répond plus) alors que les Données sont chargées.
Essayez de mettre à jour le code C# pour le ci-dessous:
Vous pouvez également mettre à jour la Liaison bidirectionnelle, cependant, je ne pense que c'est la valeur par défaut.
Grand, heureux de vous aider.
OriginalL'auteur Lee Campbell