none
WinRT-Gegenstück zur Java Klasse JTable gesucht RRS feed

  • Frage

  • Hallo MSDN-Gemeinde,

    ich wurde was Windows 8.1 und WinRT angeht ohne Hilfe ins sprichwörtliche kalte Wasser geworfen.

    Nun soll ich eine Windows 8.1 App entwickeln, die unter anderem Daten tabellarisch, scrollbar und editierbar darstellen soll. Folglich brauche ich etwas, eine Klasse oder ein eigenes Konstrukt, das mit der Klasse JTable von Java vergleichbar ist. Bisher waren meine Versuche etwas derartiges zu konstruieren leider erfolglos.

    Ich hoffe daher, dass man mir hier den richtigen Weg zum Ziel aufzeigen kann.

    Grüße

    ZaHaDum1984

    Montag, 9. März 2015 10:56

Antworten

  • Hallo,
    wenn du immer fixe Spaltenbreiten verwenden kannst, findet man auch einige Beispiele im Internet dazu. Die Größenveränderung der Spalten kann man zwar auch implementieren, ich konnte aber auf die Schnelle nichts einfaches dazu finden.

    Ich weiß nicht, wie das JTable unter Java verwendet wird. Unter .NET erstellt man typischer Weise eine eigene Klasse für einen Datensatz. Diese sollte INotifyPropertyChanged implementieren, damit bei einer Änderung die GUI informiert wird. Hier ein Beispiel dafür:

    public class LogItem : INotifyPropertyChanged
    {
        private string _Notification;
    
        public string Notification
        {
            get { return _Notification; }
            set
            {
                if (_Notification != value)
                {
                    _Notification = value;
                    OnPropertyChanged();
                }
            }
        }
    
        private LogItemImportance _Importance;
    
        public LogItemImportance Importance
        {
            get { return _Importance; }
            set
            {
                if (_Importance != value)
                {
                    _Importance = value;
                    OnPropertyChanged();
                }
            }
        }
    
        #region INotifyPropertyChanged Member
    
        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            var evt = this.PropertyChanged;
            if (evt != null)
                evt(this, new PropertyChangedEventArgs(propertyName));
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    
    }
    
    public enum LogItemImportance
    {
        Height,
        Middle,
        Low,
    }
    In der Seite kannst du dann eine Liste dieser Klasse anlegen. Dabei sollte es sich um eine ObservableCollection<T> handeln, da diese ebenfalls die GUI über Änderungen informiert.
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.LogItems = new ObservableCollection<LogItem>();//Liste initialisieren
            this.DataContext = this;//Hier wird dann bei Bindungen gesucht
    
            this.InitializeComponent();
    
            //Elemente hinzufügen
            LogItems.Add(new LogItem() { Notification = "A", Importance = LogItemImportance.Low });
            LogItems.Add(new LogItem() { Notification = "B", Importance = LogItemImportance.Middle });
            LogItems.Add(new LogItem() { Notification = "C", Importance = LogItemImportance.Height });
            LogItems.Add(new LogItem() { Notification = "D", Importance = LogItemImportance.Middle });
    
        }
        //Öffentliche Eigenschaft
        public ObservableCollection<LogItem> LogItems { get; set; }
    Im XAML kannst du dann mit einem Grid die Spalten erzeugen und daran an die Eigenschaften der Klasse binden:
    <ListView ItemsSource="{Binding LogItems}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Text="{Binding Notification, Mode=TwoWay}" />
                    <TextBlock Text="{Binding Importance}" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    In dem Beispiel werden beide Eigenschaften gebunden. Die 2. Spalte ist immer doppelt so breit wie die 1. Die Spalte Notification kann man auch bearbeiten. Über die Header-Eigenschaft kannst du auch noch Spaltenköpfe hinzufügen:
    <ListView.Header>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="2*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="Benachrichtigung" />
            <TextBlock Text="Wichtigkeit" Grid.Column="1"/>
        </Grid>
    </ListView.Header>

    Wie aber auch schon Markus schrieb wirst du noch einiges am Design ändern müssen. Nur die Anordnung der Standardelemente sieht nicht immer so schön aus.

    PS: Ändere bitte den Typ diesen Threads in "Frage". Das kannst du über deinem Eingangs-Posting über den Link "Typ ändern" tun.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 9. März 2015 14:25

Alle Antworten

  • Hi,

    ich habe mir mal ein wenig die JTable Klasse angeschaut. In Windows Runtime Apps stellt man Datenauflistungen mithilfe von ListView oder GridView-Steuerelementen dar. Unter [1] findest du einen Einstiegspunkt.

    Leider entspricht das nicht wirklich einer JTable. Du musst hier noch einiges am Style und Template anpassen, damit es etwas so aussieht wir eine JTable. Eine JTable ähnelt ziemlich einem DataGridView-Steuerelement, aber dieses gibt es leider nicht innerhalb einer Windows Runtime App [2].

    [1] https://msdn.microsoft.com/de-de/library/windows/apps/xaml/hh780650.aspx
    [2] https://social.msdn.microsoft.com/Forums/windowsapps/en-US/a9a59c2d-6c06-42ba-85a3-afeb899dd20b/data-grid-view-in-windows-store-apps?forum=winappswithcsharp

    Viele Grüße
    Markus Kocybik
    Entwickler-Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN-Entwickler-Hotline: http://www.msdn-online.de/Hotline
    MSDN-Entwickler-Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu Markenzeichen, Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN-Entwickler-Hotline.

    • Bearbeitet Zorro14 Montag, 9. März 2015 12:35
    Montag, 9. März 2015 12:31
  • Hallo,
    wenn du immer fixe Spaltenbreiten verwenden kannst, findet man auch einige Beispiele im Internet dazu. Die Größenveränderung der Spalten kann man zwar auch implementieren, ich konnte aber auf die Schnelle nichts einfaches dazu finden.

    Ich weiß nicht, wie das JTable unter Java verwendet wird. Unter .NET erstellt man typischer Weise eine eigene Klasse für einen Datensatz. Diese sollte INotifyPropertyChanged implementieren, damit bei einer Änderung die GUI informiert wird. Hier ein Beispiel dafür:

    public class LogItem : INotifyPropertyChanged
    {
        private string _Notification;
    
        public string Notification
        {
            get { return _Notification; }
            set
            {
                if (_Notification != value)
                {
                    _Notification = value;
                    OnPropertyChanged();
                }
            }
        }
    
        private LogItemImportance _Importance;
    
        public LogItemImportance Importance
        {
            get { return _Importance; }
            set
            {
                if (_Importance != value)
                {
                    _Importance = value;
                    OnPropertyChanged();
                }
            }
        }
    
        #region INotifyPropertyChanged Member
    
        private void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            var evt = this.PropertyChanged;
            if (evt != null)
                evt(this, new PropertyChangedEventArgs(propertyName));
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    
    }
    
    public enum LogItemImportance
    {
        Height,
        Middle,
        Low,
    }
    In der Seite kannst du dann eine Liste dieser Klasse anlegen. Dabei sollte es sich um eine ObservableCollection<T> handeln, da diese ebenfalls die GUI über Änderungen informiert.
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.LogItems = new ObservableCollection<LogItem>();//Liste initialisieren
            this.DataContext = this;//Hier wird dann bei Bindungen gesucht
    
            this.InitializeComponent();
    
            //Elemente hinzufügen
            LogItems.Add(new LogItem() { Notification = "A", Importance = LogItemImportance.Low });
            LogItems.Add(new LogItem() { Notification = "B", Importance = LogItemImportance.Middle });
            LogItems.Add(new LogItem() { Notification = "C", Importance = LogItemImportance.Height });
            LogItems.Add(new LogItem() { Notification = "D", Importance = LogItemImportance.Middle });
    
        }
        //Öffentliche Eigenschaft
        public ObservableCollection<LogItem> LogItems { get; set; }
    Im XAML kannst du dann mit einem Grid die Spalten erzeugen und daran an die Eigenschaften der Klasse binden:
    <ListView ItemsSource="{Binding LogItems}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Text="{Binding Notification, Mode=TwoWay}" />
                    <TextBlock Text="{Binding Importance}" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
    In dem Beispiel werden beide Eigenschaften gebunden. Die 2. Spalte ist immer doppelt so breit wie die 1. Die Spalte Notification kann man auch bearbeiten. Über die Header-Eigenschaft kannst du auch noch Spaltenköpfe hinzufügen:
    <ListView.Header>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="2*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="Benachrichtigung" />
            <TextBlock Text="Wichtigkeit" Grid.Column="1"/>
        </Grid>
    </ListView.Header>

    Wie aber auch schon Markus schrieb wirst du noch einiges am Design ändern müssen. Nur die Anordnung der Standardelemente sieht nicht immer so schön aus.

    PS: Ändere bitte den Typ diesen Threads in "Frage". Das kannst du über deinem Eingangs-Posting über den Link "Typ ändern" tun.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Montag, 9. März 2015 14:25