Podmínky v GridView   zodpovězená otázka

ASP.NET WebForms

Zdravím, mám dotaz:

obecně: jakým kódem lze změnit vlastnosti sloupce nebo řádku v GridView na základě nějaké podmínky.

konkrétně: chci změnit barvu písma pokud se po načtení z DB ve sloupci objeví datum větší než je datum aktuální.

Díky za radu.

B.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravim.

Muzete to odchytit tusim v udalosti OnItemCreated nebo OnItemDatabound kde si odchytite hodnotu z databaze predtim nez je nabindovana do gridview. Staci si tam udelat podminku a pres findcontrol najit control do ktereho bindujete hodnotu a u nej nastavit barvu dle uvazeni.

Snad vam pomuze

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za rychlou odpověď, ale jsem spíše začátečník a moc by mi pomohl názorný příklad nebo podrobnější popis. Nápověda v MSDN mi nepomohla. Ještě jednou díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var label = (Label)e.Row.FindControl("LabelID");
                if (Convert.ToDateTime(label.Text) > DateTime.Now)
                {
                    label.BackColor = System.Drawing.Color.Red;
                    // nebo
                    label.CssClass = "..."
                }
            }
        }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky moc, jenom škoda, že jsem na začátku neuvedl, že programuji ve VB.NET. Snad se mi podaří tento kód do VB.NET převést.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)

If (e.Row.RowType = DataControlRowType.DataRow) Then

Dim label = CType(e.Row.FindControl("LabelID"),Label)

If (Convert.ToDateTime(label.Text) > DateTime.Now) Then

label.BackColor = System.Drawing.Color.Red

' nebo

label.CssClass = "..."

End If

End If

End Sub

Dotazy? :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky moc za překlad do VB.NET. Už se zdálo že je všechno OK, ale vyskytl se další problém - po spuštění hlásí program chybovou hlášku na konci řádku: If (Convert.ToDateTime(label.Text) > DateTime.Now) Then -

An exception of type 'System.NullReferenceException' occurred in App_Web_uv6p9acl.dll but was not handled in user code

Additional information: Odkaz na objekt není nastaven na instanci objektu.

Bohužel nevím jak odkaz na instanci objektu nastavit.

Můžete mi poradit? Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tahle vyjimka znamena ze nenasel ten label na radku kde je e.row.findcontrol mas tam spravne ID ? Je tam spravne ID, je v gridview vubec label ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Předně díky moc za trpělivost, snad již poslední reakce. Label tam opravdu nebyl. Teď jsem to opravil:

........

 <asp:TemplateField HeaderText="Datum">
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("EndDate", "{0:d.MM.yyyy}") %>'></asp:Label>
                </ItemTemplate>

.........

a po spuštění kódu

 Protected Sub GridView2_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
        If (e.Row.RowType = DataControlRowType.DataRow) Then
            Dim Label = CType(e.Row.FindControl("Label1"), Label)
            If (Convert.ToDateTime(Label.Text) < DateTime.Now.Date) Then
                Label.BackColor = System.Drawing.Color.Red
            End If
        End If
    End Sub

mi vyběhne v podmínce po Then hláška: Řetězec nebyl rozpoznán jako platný typ DateTime.

Přitom je z DB nabindován datový typ DATETIME. Ještě mě napadlo jestli to nějak nesouvisí s formátováním data na "{0:d.MM.yyyy}"). Díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Už jsem dlouho ve webforms nedělal, ale mám pocit, že formát datumu se psal takto

<asp:Label ID="Label1" runat="server" Text='<%# Bind("EndDate", "{0:d}") %>'></asp:Label>

pro krátké datum, např. 15.8.2016 a takto

<asp:Label ID="Label1" runat="server" Text='<%# Bind("EndDate", "{0:D}") %>'></asp:Label>

pro delší datum, např. 15.srpna 2016

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokuste se dostat to datum primo z e.Row.DataItem driv nez se nabinduje do labelu.


If (e.Row.RowType = DataControlRowType.DataRow) Then
  '
  Dim dr As DataRow = DirectCast(e.Row.DataItem, DataRowView).Row
  
  'dr(2) > kde cislo je index sloupce v gridview. Prvni sloupec ma index 0.
  'vlozit index sloupce kde bindujete datum (0,1,2,3....)
  Dim datum As DateTime = Convert.ToDateTime(dr(2))
  
  If (datum < DateTime.Now.Date) Then
     Dim Label = CType(e.Row.FindControl("Label1"), Label)
     Label.BackColor = System.Drawing.Color.Red
  End If

End If

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky, už jsem si myslel že je všechno OK, ale po zadání kódu do Visual Studia a kontrole syntaxe se objevil další problém : "Typy DataRow a DataRowView nejsou definovány".

nahlásit spamnahlásit spam 0 odpovědětodpovědět

asi budou chybět nějaké usingy...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
Import System.Data
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ještě jednou díky moc - už to funguje!!! Můžete doporučit nějakou literaturu, odkazy a pod. abych vás příště nezdržoval? :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback