Kurtturuusu, Nummen kirkonkylä

  Pääsivulle  |  TIETOTEKNIIKAN PÄÄSIVULLE

Datagrid (WPF)

Tässä on esimerkki DataGridin käytöstä tekstimuotoisen tiedon esittämisessä. Taulukossa esitettävä tietorivi on oma luokkansa Grivi, eli taulukossa esitettävä tieto on näiden luokkien taulukko. Tämä tekee koodaamisesta selkeää.

Tässä rivejä ei voi käyttäjä muokata, eli xaml-tiedostossa on määrittely IsReadOnly="True".
Valitun rivin oletusväri on vaihdettu "omaan" väriin (siniseen).
Ensimmäisen sarakkeen tiedot on sisennetty oikeaan reunaan, ks. xaml-tiedosto.
Koodissa on annettu tietolähde (ItemsSource) ja xaml:ssa sarakekohtainen "Binding=".

Tässä muutama hyödyllinen koodirivi, jos sovelluksesta tehdään monipuolisempi:
// Halutun rivin (ihaluttu) laittaminen datagridissä valituksi:
dgTiedot.SelectedItem = null;  // poistetaan aiempi valinta
foreach (Grivi item in dgTiedot.Items)   // etsitään rivi
{
   if (item.IDi = ihaluttu)
   {
      dgTiedot.SelectedItem = item;  // uusi valinta
      dgTiedot.ScrollIntoView(item); // skrollataan se esille
      break;
   }
}

// Jos on tarve scrollata tietty rivi näkyviin, esimerkki:
dgTiedot.ScrollIntoView(dgTiedot.Items[20]);


JA SITTEN OHJELMAKOODIT

Ensin on ikkunan kuvaus xaml-tiedostona ja sen jälkeen C#-koodi, joka tulee omaksi tiedostokseen. Sovellus muodostaa tietorivien sisällöt keinotekoisina for-loopissa. Normaalisoftassa tiedot luetaan esimerkiksi tietokannasta.

<!--- 5.2.2018  MainWindow.xaml-->
<Window x:Class="Datagrid_testi.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Datagrid_testi"
        mc:Ignorable="d"
        Title="Datagrid_testi" Height="320" Width="625"
          Closing="Window_Closing">
    <StackPanel>
        <StackPanel Orientation="Horizontal" Background="LightCyan">
            <Button x:Name="buttonTiedot" FontWeight="Bold" Margin="15,10"
                PreviewMouseLeftButtonUp="ButtonTiedot_Click" Content=" Tietoja valinnasta "/>
            <Button x:Name="buttonSulje" FontWeight="Bold" Margin="300,10,20,10"
                PreviewMouseLeftButtonUp="ButtonSulje_Click" Content=" Sulje "/>
        </StackPanel>
        <ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="0" Padding="0">
            <DataGrid x:Name="dgTiedot" AutoGenerateColumns="False" Height="234"
                         RowBackground="Bisque" AlternatingRowBackground="Khaki" AlternationCount="2"
                          CanUserResizeRows="False" SelectionMode="Single" IsReadOnly="True">
                <DataGrid.Resources>
                    <!--- korvattu valinnan vaaleanharmaa vaaleansinisellä -->
                    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
                        Color="LightSkyBlue"/>
                    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}"
                        Color="White"/>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="idUkoor" Binding="{Binding IDi}"  >
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="HorizontalAlignment" Value="Right" />
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Maa" Binding="{Binding Maaz}" />
                    <DataGridTextColumn Header="Paikkanimi" Binding="{Binding Nimiz}" />
                    <DataGridTextColumn Header="Lati" Binding="{Binding Latiz}" />
                    <DataGridTextColumn Header="Longi" Binding="{Binding Longiz}" />
                    <DataGridTextColumn Header="Selitys" Binding="{Binding Lisaz}" />
                </DataGrid.Columns>
            </DataGrid>
        </ScrollViewer>
    </StackPanel>
</Window>


*************************************************************************
//  5.2.2018   MainWindow.xaml.cs  (Datagrid_testi)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Datagrid_testi
{
    // ***********************************************************
    // Taulukon yksi rivi
    public class Grivi
    {
        public int IDi { get; set; } = -1;   // auto-property with property initializer
        public string Nimiz { get; set; } = "";  // default on null, siksi initializer
        public string Latiz { get; set; } = "";
        public string Longiz { get; set; } = "";
        public string Lisaz { get; set; } = "";
        public string Maaz { get; set; } = "";
    }

    // ***********************************************************
    // Ikkunan luokka
    public partial class MainWindow : Window
    {
        private List<Grivi> tulostaulu;  // datagrid-taulukon sisältö

        //-----------------------------------------------------------------
        // 5.2.2018  X01
        public MainWindow()
        {
            InitializeComponent();

            tulostaulu = new List<Grivi>();  // datagidin rivit

            for (int i=0;i<30;i++)    // Taulukkoon 30 riviä sisältöä
            {
                Grivi gri = new Grivi()   // laitetaan riveille jotain tietoa
                {
                    IDi = i,
                    Nimiz = (i < 15) ? $"Mäntsälä_{i}" : $"Kitee_{i - 14}",
                    Latiz = (i < 15) ? $"60.63805{i}" : $"62.09887{i - 14}",
                    Longiz = (i < 15) ? $"25.3184{i}" : $"30.13611{i - 14}",
                    Lisaz = $"Lisätietoa_{i} - täällä on kaunis luonto ja runsaasti patikkapolkuja",
                    Maaz = "Suomi"
                };
                tulostaulu.Add(gri);    // lisätään tehty rivi taulukkoon
            }
            dgTiedot.ItemsSource = tulostaulu;  // taulukon tietolähteen määrittely
        }

        //-----------------------------------------------------------------
        // 18.1.2018  X28
        // Rivi on valittu ja tehdään tietojen kanssa jotain
        private void ButtonTiedot_Click(object sender, MouseButtonEventArgs e)
        {
            Grivi vak = (Grivi)dgTiedot.SelectedItem;  // valittu rivi
            if (vak == null)
            {
                MessageBox.Show("Valitse ensin joku rivi", "(X28-01) Ilmoitus");
                return;
            }
            string mez = $"Nyt mentäisiin antamaan lisätietoja\nrivistä, jonka IdUkoor = {vak.IDi}";
            MessageBox.Show(mez, "(X28-01) Ilmoitus");
        }

        //-----------------------------------------------------------------
        // 31.1.2018   X04
        // Käyttäjä painoi Sulje -painiketta
        private void ButtonSulje_Click(object sender, MouseButtonEventArgs e)
        {
            this.Close();
        }

        // ---------------------------------------------------------------
        // 20.11.2017   X20
        // Tänne tullaan, jos tuli komento this.Close()
        // tänne tullaan myös jos käyttäjä klikkaa ikkunan sulkemisruksia
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // tähän voi sijoittaa lopetustoimintoja, esim. jonkun resurssin vapautus
            // tai lopetuksen peruutus eli e.Cancel = true;
        }
    }
}



--------------------------------
(sivua muokattu  5.2.2018)