Laden...

DataGrid-Spalte verstecken, welche per Binding eingefügt wird

Erstellt von Hunv vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.064 Views
Hunv Themenstarter:in
193 Beiträge seit 2005
vor 11 Jahren
DataGrid-Spalte verstecken, welche per Binding eingefügt wird

Hi,

ich habe ein DataGrid, das über folgenden Code ein Binding bekommt und so mit Daten gefüllt wird:

List<UserCredential> uc = GetUserCredentialsAll();

            Binding b = new Binding("");
            b.Mode = BindingMode.OneTime;
            b.Source = uc;

            dataGrid1.SetBinding(DataGrid.ItemsSourceProperty, b);

Der XAML-Code dazu ist nichts besonderes:

<DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="12,0,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="448" />

Nun möchte ich aber dort eingefügte Spalten verstecken. Wie geht das? Oder sollte man das ganze dann Grundsätzlich anders angehen?

Über die Variablenbennenung etc. bitte keine Gedanken machen.

Visit me @ www.beremote.net

6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

die einfachste Möglichkeit wäre AutoGenerateColumns auf false zu setzen und die Spalten manuell anzulegen. Ne weitere wäre das AutoGeneratingColumn Event zu abonieren und in den Eventargs gibts nen Parameter wo du sagen kannst, dass die aktuelle Spalte nicht generiert werden soll.

Das Binding kannst du in deinem Fall übrigens durch ne einfache Zuweisung ersetzen, da du ja nur OneTime - daher einmalig bindest, und auch nur ne List<T> benutzt die eh keine ChangeNotification unterstützt.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hunv Themenstarter:in
193 Beiträge seit 2005
vor 11 Jahren

Klasse, danke.
Habe das nun mit AutoGeneratingColumn gemacht. Funktioniert soweit.

Mein nächstes Problem ist nun, dass das SelectedItem irgendwie nicht gesetzt wird.

Im XAML ist folgendes zusätzlich gesetzt: SelectedItem="{Binding SelectedItem, Mode=TwoWay}"

Im Code das hier:


        public DataRowView SelectedItem
        {
            get
            {
                return selectedItem;
            }
            set
            {
                selectedItem = value;
            }
        }
        private DataRowView selectedItem;

Wenn ich alles richtig verstanden habe, müsste bei der Änderung der selektierten Zeile, SelectedItem gesetzt werden. Dem ist aber nicht so. Fehlt noch etwas?

Visit me @ www.beremote.net

6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

TwoWay Binding geht schonmal nicht, da du ja nicht INotifyPropertyChanged eingebaut hast. Die Richtung GUI -> Daten sollte an sich schon gehen, wenn nicht irgendwo ausversehen direkt nen Wert gesetzt wird, der des Binding überschreibt.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hunv Themenstarter:in
193 Beiträge seit 2005
vor 11 Jahren

Hmm, funktionieren tut es irgendwie trotzdem nicht, auch ohne TwoWay.

Hier mal der gesamte Code des Testprojektes:

Code:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public DataRowView SelectedItem
        {
            get{return selectedItem;}
            set{selectedItem = value;}
        }
        private DataRowView selectedItem;
        
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<UserCredential> uc = GetUserCredentialsAll(2);

            Binding b = new Binding("");
            b.Mode = BindingMode.OneTime;
            b.Source = uc;

            dataGrid1.SetBinding(DataGrid.ItemsSourceProperty, b);
        }

        private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.Column.Header.ToString() == "Id")
                e.Column.Visibility = System.Windows.Visibility.Hidden;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(selectedItem.ToString());
        }
    }

Die Methode "GetUserCredentialsAll(2)" gibt eine Liste folgender Klasse zurück:

public class UserCredential
    {
        public UserCredential(int Id, string Username, SecureString Password, string Domain, string description, int Owner);

        public string Description { get; set; }
        public string Domain { get; set; }
        public int Id { get; set; }
        public int Owner { get; set; }
        public SecureString Password { get; set; }
        public string Username { get; set; }

        public string getDescription();
        public string getDomain();
        public int getId();
        public int getOwner();
        public SecureString getPassword();
        public string getUsername();
    }

Der XAML-Code sieht wie folgt aus:

<Window xmlns:my="clr-namespace:TestBed._2"  x:Class="TestBed._2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestBed._2" 
        Title="MainWindow" Height="350" Width="865" Loaded="Window_Loaded">
    <Grid>
        <DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="12,0,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="448" AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn" SelectedItem="{Binding SelectedItem}">
        </DataGrid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="522,92,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>

Visit me @ www.beremote.net

6.862 Beiträge seit 2003
vor 11 Jahren

Hallo,

du hast da zwei Fehler drin. Der DataContext vom DataGrid ist ja null, daher kann bei

SelectedItem="{Binding SelectedItem}

gegen gar kein Objekt gebunden werden. Wenn das behoben ist, ist das zweite Problem der Typ von SelectedItem. Wie kommst du drauf das es ne DataRowView sein soll, wenn du UserCredential Objekte reintust? Einfach mal im Debugger die Bindingfehler angucken, da siehst du dann das es nen Fehler gibt und er die Typen natürlich nicht konvertieren kann.

Baka wa shinanakya naoranai.

Mein XING Profil.

Hunv Themenstarter:in
193 Beiträge seit 2005
vor 11 Jahren

Hi,

sorry für die späte Rückmeldung, aber ich bin nicht zum Programmieren gekommen 😉

Zum Thema:
das mit dem Datentyp ist soweit verständlich und auch logisch.
Mit dem DataContext harpert es noch etwas. Was genau muss der DataContext sein? Ich würde sagen die "uc"-Variable, richtig? Wie bekomme ich das dem Control beigebracht?

Visit me @ www.beremote.net

Hunv Themenstarter:in
193 Beiträge seit 2005
vor 11 Jahren

Hi,

ich habe nun eine Lösung dafür.
Der XAML-Code ist gleich geblieben.
Der Rest seht nun so aus:


    public partial class MainWindow : Window
    {
        List<UserCredential> uc;

        public MainWindow()
        {
            InitializeComponent();

            uc = StorageCore.GetStorageCore().GetUserCredentialsAll(3);

            Binding b = new Binding("");
            b.Mode = BindingMode.OneTime;
            b.Source = uc;

            dataGrid1.SetBinding(DataGrid.ItemsSourceProperty, b);
        }
        
        private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.Column.Header.ToString() == "Id")
                e.Column.Visibility = System.Windows.Visibility.Hidden;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            UserCredential myRow = (UserCredential)dataGrid1.SelectedItem;

            MessageBox.Show(myRow.Description);
        }
    }

Das entscheidende war das, was in button1_Click steht.
Danke für deine Hilfe!

Visit me @ www.beremote.net