Forum: PC-Programmierung DataGrid RowDetails Daten hinzufügen


von MikroMakro (Gast)


Lesenswert?

Hallo.

Ich benötige einen Ansatz um folgende Aufgabe zu lösen.

Ich habe ein DataGrid (das Neue, ab 4.0), welches ich über eine
ObservableCollection<Klasse> füllen lasse. Das funktioniert tadellos.

In diesem DataGrid werden Dateien aufgelistet.
Mit einem Doppelklick auf die entsprechende Datei im Datagrid wird ein 
Wert aus dieser Datei extrahiert (das funktioniert) und im Normalfall in 
eine Variable gespeichert.
Nun soll dieser Wert in den DataGrid RowDetails angezeigt werden.
Und hier komme ich nicht weiter.

Wie bekomme ich den Wert in die RowDetail-Anzeige, da ich keinen 
direkten Zugrif auf die Rowdetails habe. Und mit der bestehenden Binding 
komme ich irgendwie nicht weiter, da das Binding des Datagrids ja schon 
zur "anderen" Klasse der -ObservableCollection<Klasse> -gehört.

Bitte um einen Gedankenanstoss.
Danke im Voraus.

MikroMakro

von hilmar (Gast)


Lesenswert?

> (das Neue, ab 4.0)
Ach so, das neue meinst du?

Jetzt fehlt nur noch die Programmiersprache, das Betriebssystem und 
andere unwichtige Nebensächlichkeiten...

von MikroMakro (Gast)


Lesenswert?

Upps, sorry.

C#, WPF, Windows7

>"das Neue" siehe: [[Beitrag "C# DataGridView löst DataGrid ab und umgekehrt. Wie denn nun?"]]

Welche Angaben wären noch wichtig?

von Frieder S. (frsc)


Lesenswert?

Warum fügst du der Klasse die in deiner ObservableCollection gelistet 
wird nicht ein Property hinzu, in dem der Wert abgelegt wird?

Anschließend kannst du einfach in deinem RowDetailsTemplate an dieses 
Property binden.

von MikroMakro (Gast)


Lesenswert?

Hallo Frieder S, Danke für deinen Beitrag.
Mhm.. so einfach hatte ich nicht gedacht. :(

Ich habe nun ein paar Tage hin und her probiert.
Ich kann dem eingefügten Propertie einen Wert zuweisen und auch abrufen.
Das RowDetail ist, denke ich, soweit an das Propertie gebunden.
Leider erscheint der Wert nicht in den RowDetails.
Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert 
zu, so wird er in den RowDetails angezeigt.

Es geht um den Wert von "SizeMax"

Hier ein Teil des XAML-Codes.

1
    <Grid>
2
        <DataGrid AutoGenerateColumns="False" Name="dataGrid">
3
            <DataGrid.RowDetailsTemplate>
4
                <DataTemplate>
5
                    <StackPanel Orientation="Vertical" >
6
                        <StackPanel Orientation="Horizontal">
7
                            <Label Content="SizeMAX" Width="100"/>
8
                            <Label Content="{Binding Path=SizeMax}" Width="100"/>
9
                        </StackPanel>
10
                    </StackPanel>
11
                </DataTemplate>
12
            </DataGrid.RowDetailsTemplate>
13
        </DataGrid>
14
    </Grid>

.
.
.

Hier des Viewmodels
1
public class getFolderInfo : INotifyPropertyChanged
2
    {
3
4
       
5
6
        private string _ID;
7
        private string _Datum;
8
        
9
      
10
11
        public getFolderInfo(string Lot_ID, string CreationDate)
12
        {
13
            // TODO: Complete member initialization
14
            this._ID = ID;
15
            this._Datum = CreationDate;
16
       
17
18
        
19
        }
20
21
        public string ID
22
        {
23
            get { return _ID; }
24
            set { _ID = value; }
25
        }
26
27
        public string CreationDate
28
        {
29
            get { return _Datum; }
30
            set { _Datum = value; }
31
        }
32
33
34
        public event PropertyChangedEventHandler PropertyChanged;
35
        private string _SizeMax;
36
37
38
        
39
        public getFolderInfo(string SizeMax)
40
        {
41
            this._SizeMax = SizeMax;
42
        }
43
          
44
45
        public string SizeMax
46
        {
47
            get { return _SizeMax; }
48
            set
49
            {
50
                if (_SizeMax == value)
51
                {
52
                    return;
53
                }
54
                _SizeMax = value;
55
                OnPropertyChanged("SizeMax");
56
            }
57
        }
58
59
        private void OnPropertyChanged(string p)
60
        {
61
            PropertyChangedEventHandler handler = PropertyChanged;
62
            if (handler != null) { handler(this, new PropertyChangedEventArgs(p)); }
63
        }      
64
    }
65
66
     
67
68
    public class Folders : ObservableCollection<getFolderInfo>
69
    {
70
        DirectoryInfo ResultDirectory = new DirectoryInfo(@"d:/log/");
71
       
72
        public Folders()
73
            : base()
74
        {
75
            foreach (DirectoryInfo di in ResultDirectory.GetDirectories())
76
            {            
77
                Add(new getFolderInfo(di.ToString(), di.CreationTime.ToString()));
78
            }
79
        }             
80
    }
81
}


Muss das Datagrid noch ein Update erfahren?
Íst das INotifyPropertyChanged hier richtig?

Danke im Voraus.

von Frieder S. (frsc)


Lesenswert?

Ich bin auch kein WPF-Experte, aber ich versuch mal zu helfen so gut es 
geht:

Setzt du auch irgendwo den DataContext für dein DataGrid?
Das Grid muss ja wissen, wo es nach dem Property "SizeMax" suchen soll.

Machst du die Zuweisung der Daten von der ObservableCollection zum 
DataGrid einmalig, manuell im Code Behind?
Das würde erklären warum die Änderungen nicht angezeigt werden, oder was 
meinst du damit:

> Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert
> zu, so wird er in den RowDetails angezeigt.

gleich zuweisen = im Konstruktor des MainWindow?

von MikroMakro (Gast)


Lesenswert?

>Setzt du auch irgendwo den DataContext für dein DataGrid?
>Das Grid muss ja wissen, wo es nach dem Property "SizeMax" suchen soll.

Ich hatte den Aufbau des Datagrids und die ItemSource im Code Behind 
relasiert.
1
dataGrid.ItemsSource = new Folders();
(wird einmal im MainWindow ausgeführt)

>Machst du die Zuweisung der Daten von der ObservableCollection zum
>DataGrid einmalig, manuell im Code Behind?

Was meinst du damit? Das Füllen des Datagrids?
-> das passiert ja in:
1
public class Folders : ObservableCollection<getFolderInfo>

Oder meinst du die Wertzuweisung für SizeMax?
Den Wert von SizeMax weise ich einmal zu.
Im dataGrid.SelectionChanged - Ereignis bzw. im 
dataGrid.MouseDoubleClick - Ereignis


> Weise ich dem Propertie in der Klasse getFolterInfo gleich einen Wert
> zu, so wird er in den RowDetails angezeigt.

>gleich zuweisen = im Konstruktor des MainWindow?

Damit hatte ich gemeint, dass ich in der Klasse getFolderInfo hier:
1
 private string _SizeMax = 100;
zuweise, um zu testen, dass der Wert in den Rowdetails angezeigt wird.
Das funktioniert. Nur eben nicht , wenn ich den Wert über
1
dataGrid.SelectionChanged - Ereignis bzw. im dataGrid.MouseDoubleClick - Ereignis
 zuweise. :(

Somit will ich erreichen, dass erst bei anklicken des gewählten 
DataGridItems die damit verbundene Datei bearbeitet wird und der Wert 
für SizeMax zugewiesen und angezeigt wird.

von Frieder S. (frsc)


Lesenswert?

Ok. Aber wenn du nur die ItemsSource für das DataGrid festlegst stimmt 
doch der DataContext trotzdem noch nicht, oder?
Und mit
1
dataGrid.ItemsSource = new Folders();
 weist du ja nur eine lokale Instanz als Quelle für das DataGrid zu.

Eigentlich müsste es doch so gehen (im MainWindow):
1
private Folders folders = new Folders(); 
2
3
public MainWindow()
4
{
5
    InitializeComponent();
6
    ...
7
    dataGrid.DataContext = folders;
8
    dataGrid.ItemsSource = fodlers; 
9
    ...
10
}

von MikroMakro (Gast)


Lesenswert?

mhm... ok soweit so gut :)
1
folders.Add(new getFolderInfo(100.3));

Hiermit kann ich eine neue Zeile im Datagrid erzeugen mit einem Wert für 
SizeMax in den RowDetails.
Nun muss es nur noch für die selektierte Zeile/Item erfolgen.
Hast du da noch eine Idee?

von Frieder S. (frsc)


Lesenswert?

Du musst ja kein neues Item hinzufügen. Im SelctionChanged Event kannst 
du ja folgendes machen:
1
folders[dataGrid.SelectedIndex].SizeMax = 100.3;
(Ich hab das jetzt nicht getestet)

von MikroMakro (Gast)


Lesenswert?

Oh man! Ich weiß gar nicht wie ich Dir danken soll.
So funktioniert es, wie ich es haben will.

Danke!

Da fehlen mir echt noch´n paar Basics.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.