Diskuze: DataGrid - Rows

C# .NET .NET (C# a Visual Basic) DataGrid - Rows American English version English version

Avatar
N-nojmi
Člen
Avatar
N-nojmi:

Zdravím,
při vytváření aplikace ve WPF jsem narazil na problém s DataGridem, bohužel ať se snažím jak chci, nemohu zprovoznit myšlenku:

V datagridu jsou načtená data z DB, kde se zobrazují sloupce Nazev a PlatnostDo.
Při spuštění aplikace bych potřeboval, aby se cyklus podíval na data zobrazená v Gridu a pokud se bude blížit datum "expirace" chtěl bych upozornit uživatele, minimálně podbarvením onoho řádku barvou.

Všude se píše jak tuto operaci udělat, ale jen pro datagridview..... ;-(
Zde je kód co bych si představoval:

public void Zkontroluj()
        {


            foreach (DataGridViewRow row in grdUvod.Rows)
            {
                var now = DateTime.Now;
                var expirationDate = DateTime.Parse(row.Cells[0].Value.ToString());
                var sevenDayBefore = expirationDate.AddDays(-7);

                if (now > sevenDayBefore && now < expirationDate)
                {
                    row.DefaultCellStyle.BackColor = System.Drawing.Color.Yellow;
                }
                else if (now > expirationDate)
                {
                    row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;
                }
            }
        }

Bohužel ,ale nevím jak pokračovat dál.....

Doufám, že poradíte. Předem moc děkuju

Odpovědět 25.8.2015 13:33
Není hloupých lidí, jen lidí co málo používají google...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na N-nojmi
Jan Vargovský:

Koukni na style triggery.

Když jsem si hrál ještě s WPF, tak jsem dělal přesně něco podobného. Pro ukázku jak to vypadalo:

<Style x:Key="CellStyle" TargetType="DataGridCell">
    <Setter Property="FontFamily" Value="Calibri"/>
    <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
    <Setter Property="Padding" Value="5,15"/>
    <Setter Property="BorderThickness" Value="0"/>
    <!--Allows padding in DataGridCell-->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsPast}" Value="True">
            <Setter Property="Foreground" Value="#a8a8a8" />
            <Setter Property="FontStyle" Value="Italic" />
            <Setter Property="Opacity" Value="0.6"/>
        </DataTrigger>

        <DataTrigger Binding="{Binding IsSure}" Value="False">
            <Setter Property="Foreground" Value="#FF999999" />
            <Setter Property="FontStyle" Value="Italic" />
        </DataTrigger>

        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="#FF3A3A3A"/>
            <Setter Property="Opacity" Value="1"/>
        </Trigger>
    </Style.Triggers>
</Style>
 
Nahoru Odpovědět 25.8.2015 14:10
Avatar
N-nojmi
Člen
Avatar
Odpovídá na Jan Vargovský
N-nojmi:

Díky, ale nejdříve bych chtěl rozběhout ten cyklus.......

Nahoru Odpovědět 25.8.2015 14:21
Není hloupých lidí, jen lidí co málo používají google...
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na N-nojmi
Jan Vargovský:

Todle je UI záležitost, takže to máš mít v XAMLu. Jestli to chceš psát někde do code-behind, počkej si na někoho jiného.

 
Nahoru Odpovědět 25.8.2015 14:22
Avatar
N-nojmi
Člen
Avatar
Odpovídá na Jan Vargovský
N-nojmi:

Právě, že bych to tak raději řešil, ale každopádně děkuju za tip, kouknu na to...

Nahoru Odpovědět 25.8.2015 14:31
Není hloupých lidí, jen lidí co málo používají google...
Avatar
Odpovídá na N-nojmi
Libor Šimo (libcosenior):

V tomto seriáli je niečo podobné, môžeš z toho výjsť.
6. díl - Upomínač narozenin v C# .NET WPF - Návrh oken
http://www.itnetwork.cz/…n-navrh-oken

Nahoru Odpovědět 25.8.2015 14:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
martin.vip
Člen
Avatar
Odpovídá na N-nojmi
martin.vip:

Dotazem do DB bych zjistil řádky, u kterých se blíží konec platnosti a potom ty řádky obarvil, cyklem for

 
Nahoru Odpovědět 25.8.2015 17:15
Avatar
N-nojmi
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
N-nojmi:

Máš nějaké zkušenosti s mazáním záznamů v DataGridu v WPF ? Je to pro mě prostě nadlidský úkol....

Mám

SqlCommand cmd = new SqlCommand("DELETE FROM Polozka WHERE ID = @ID", conn);
                    cmd.Parameters.AddWithValue("@ID", grdZaznamy.SelectedValue);
                    cmd.ExecuteNonQuery();

ale prostě nemohu zjistit jak smazat vybraný řádek.......

Nahoru Odpovědět 27.8.2015 10:32
Není hloupých lidí, jen lidí co málo používají google...
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

Něco podobného jsem v DataGridu dělal. Cyklus na zabarvování řádků tam byl taky, jen podle jiných kritérií. Jenom už je to nejakou dobu, tak mi dej chvíli než to najdu, pak sem ten cyklus hodim.
K tomu mazání:
S DataGridem byly furt nějaký problémy, tak sem nakonec vytvořil třídu představující jeden řádek, naplnil jí public proměnejma podle sloupečků, udělal z ní List<> a data z DB dával do toho listu. Pak jsem jenom Datagridu nastavil ItemsSource na null a hned po tom na ten list (bez null mi to tam dělalo bordel).
Ve výsledku sem vůbec nemusel řešit problémy s DataGridem, všechny změny sem proved na tom Listu<> a ten sem pak jenom hodil do DataGridu.

Nahoru Odpovědět  +1 27.8.2015 10:54
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Adam Ježek
Adam Ježek:

Tak už to mam a i to obarvování sem částečně ochcal tim Listem<>, ale snad by to mohlo pomoct:

/// <summary>
/// Obarví prvky v tabulce
/// </summary>
private void iniColorGridRows() {

    tabulka.ItemContainerGenerator.StatusChanged += (s, e) => { //už nevim proč, ale musí to tam bejt

        int rowCount = tabulka.Items.Count; //počet řádků v DataGridu (tabulka)
        int a = 0; //pomocná proměnná, spíš by se to mělo menovat cisloRadku nebo taknějak
        foreach (var bedna in potahyList) { //tady se foreachem projede List<> ve kterym sou data do tabulky
            if (a >= tabulka.Items.Count) //kdyby náhodou bylo v tabulce míň řádků
                break;
            var row = (DataGridRow)tabulka.ItemContainerGenerator.ContainerFromIndex(a);
                //tady podle indexu (a) vytáhnu z tabulky jeden řádek a hodim ho do proměnný row.
                //určitě by nějak šlo podle dalšího indexu zase z row vytáhnou to pole kde ty máš datum
                //já už to měl v tom listu, tak sem to neřešil

            if (row != null) { //a pokud ten řádek existuje
                if (bedna.Kusu == bedna.Vlozeno)
                    row.Background = Brushes.Green; //tak se začne obarvovat
                else if (bedna.Kusu > bedna.Vlozeno)
                    row.Background = Brushes.Orange;
                else if (bedna.Kusu < bedna.Vlozeno)
                    row.Background = Brushes.Red;
                else
                    row.Background = Brushes.Black;
                a++; //pak se jenom zvýší číslo řádku a jede se znova
            }
        }
    };
}

Teď bych si bejt tebou zjistil jak z tý proměnný row vytáhnout podle indexu tu kolonku s datem, pak jenom vezmeš for cyklus podle tabulka.Items­.Count, postupně vytaháš do proměnný row řádky, u každýho zjistíš datum a to porovnáš a podle něj obarvíš řádek přes row.Background
Snad pomůže.

Nahoru Odpovědět  +1 27.8.2015 11:25
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
N-nojmi
Člen
Avatar
Odpovídá na Adam Ježek
N-nojmi:

Díky za rady, pustím se do toho ;)

Nahoru Odpovědět 27.8.2015 12:07
Není hloupých lidí, jen lidí co málo používají google...
Avatar
Odpovídá na N-nojmi
Libor Šimo (libcosenior):

"Máš nějaké zkušenosti s mazáním záznamů v DataGridu v WPF ? Je to pro mě prostě nadlidský úkol...."

Ja používam ListBox na výpisy riadkov a tam mám nastavený výber riadka po kliknutí myšou.
S vybratým si môžem robiť čo chcem, napr. zmazať.
V triede Skladnik (niečo ako admin) mám metódu:

public void OdoberDhmZaznam(DhmZaznam dhmZaznam)
        {
            DhmZaznamy.Remove(dhmZaznam);

        }

a v main metódu

private void vymazDhmButton_Click(object sender, RoutedEventArgs e)
        {
            if (DhmListBox.SelectedItem != null)
            {
                if (MessageBox.Show("Naozaj to chcete vymazať?", "Vymazať", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
                {
                    try
                    {
                        skladnik.OdoberDhmZaznam((DhmZaznam)DhmListBox.SelectedItem);
                        skladnik.UlozDhmZaznamy();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Chyba", MessageBoxButton.OK,
                                        MessageBoxImage.Error);
                    }
                }
            }
        }

Ako som ti už písal vyššie, vychádzam z miestneho tutoriálu.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 27.8.2015 13:37
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na N-nojmi
Libor Šimo (libcosenior):

Podľa mňa nie je veľmi štastný nápad vyfarbovať vybrané riadky. Čo keď je riadkov viac ako sa vôjde do okna?, Bude sa chcieť užívateľovi scrolovať?
Možno by bolo lepšie (na pokyn - button alebo automaticky, keď taká udalosť nastane) uložiť vybraté riadky do nového listu a ten vypísať do nového okna.

Nahoru Odpovědět 27.8.2015 13:45
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
N-nojmi
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
N-nojmi:

v okně se zobrazuje asi 15 řádků a je to podle mě dostačující, je to spíš pro použití pro pár osob v okolí... takže pokud se časem ukáže že tam bude vícero záznamů, myslím, že to udělám podle tvého návrhnu ;)

Nahoru Odpovědět 28.8.2015 7:49
Není hloupých lidí, jen lidí co málo používají google...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.