Diskuze: Formátování záznamu v ASP.NET
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 50 zpráv z 55.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Barvu statusu bych řešil pomocí css uděláš si tam třídu vyhovuje a dáš jí vlastnosti. Pak jen ve stránce dáš formát pomocí
class="proměnná_status"
Datum se formátuje např. takto:
<asp:Label ID="JizdaDatumLabel" runat="server" Font-Bold="true" Text='<%# Bind("JizdaDatum", "{0:D}") %>' />
se zobrazí dlouhé datum. Když dáš malé "d" místo velkého, zobrazí se
datum krátké. Při použití "t" se zobrazí čas...
A barvu datumu bych řešil v kódu, pomocí "If" a "Else"
Mrkni se na videotutoriály na http://mstv.cz , vyber si "vývojáři", kategorii zvol "asp.net", tam se dozvíš spoustu těchto základních věcí pro tvorbu webů v ASP.NET...
Barvu bych taky řešil v kódu a to jak u data, tak i u statusu, ale nevím jak si vytáhnout jednotlivé hodnoty z FormView. Ony tam jsou sice ID Labelů, ale v kódu tyto Labely nejsou vidět. Takže jsem na mrtvém bodě. Aplikaci mám téměř hotovou, teď už jen to formátování Labelů.
Pomohlo by mi také dostat data do Labelu, tam už bych si s tím poradil, ale data mi nejdou navázat na Label.
Data do Labelů se "Bindují"
<asp:Label ID="TakenIntoEvidenceLabel" runat="server" Text='<%# Bind("TakenIntoEvidence") %>' />
a v kódu se dostaneš např na Label, který má ID="TakenIntoEvidenceLabel" ve FormView1, tak, že ho prohledáš
(FormView1.FindControl("TakenIntoEvidenceLabel") As Label).Text
Asi už dneska blbnu. Můžeš mi ten předchozí kód napsat jako podmínku: Když text = něco tak ForeColor = green.
Díky moc. Už mi to nemyslí a chtěl bych tuto část dodělat. Od zítřka makám a nebudu mít na to čas.
If ((FormView1.FindControl("TakenIntoEvidenceLabel") As Label).Text = "něco")
{
(FormView1.FindControl("TakenIntoEvidenceLabel") As Label).ForeColor = Green;
}
Else If ((FormView1.FindControl("TakenIntoEvidenceLabel") As Label).Text = "něcojinýho")
{
(FormView1.FindControl("TakenIntoEvidenceLabel") As Label).ForeColor = Red;
}
Else
{
co se má stát, když neprojde ani jedna podmínka
}
tak jinak, to předchozí jsem si vyzkoušel a nejde...
if ((FormView1.FindControl("jmenoLabel") as Label).Text == "pepík")
{
(FormView1.FindControl("jmenoLabel") as Label).ForeColor = System.Drawing.Color.Green;
}
tohle jde...
Díky, ale tak to jsem měl napsáno (v podmínce, ale ==). Háže mi to chybu v zadání barvy. To mě právě zmátlo. ForeColor = Barva nelze zadat.
Opět chyba. server hlásí:
Odkaz na objekt není nastaven na instanci objektu.
Popis: Při provádění aktuálního webového požadavku došlo k neošetřené výjimce. Další informace o chybě a o jejím původu v kódu naleznete v trasování zásobníku.
Podrobnosti o výjimce: System.NullReferenceException: Odkaz na objekt není nastaven na instanci objektu.
Zdrojová chyba:
Řádek 13: {
Řádek 14:
Řádek 15: if((FormView1.FindControl("MeasGlobalStatusLabel") as
Label).Text == "Vyhovuje")
Řádek 16: {
Řádek 17: (FormView1.FindControl("MeasGlobalStatusLabel") as
Label).ForeColor = System.Drawing.Color.Green;
Zdrojový soubor: g:\C#\Programování\2013\eli_elektro\eli_elektro\Spotr\SpotrebicDetail.aspx.cs Řádek: 15
Trasování zásobníku:
[NullReferenceException: Odkaz na objekt není nastaven na instanci
objektu.]
eli_elektro.Spotr.SpotrebicDetail.Page_Load(Object sender, EventArgs e) in
g:\C#\Programování\2013\eli_elektro\eli_elektro\Spotr\SpotrebicDetail.aspx.cs:15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,
EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+772
Když se načítá stránka, jaký Template FormView se ti načítá? Nemáš ty Labely náhodou v Template, který po načtení stránky není aktivní? Tomu by ta chyba odpovídala...
A po načtení stránky je ItemTemplate aktivní?
A bez toho ifu se ti do stránky data načtou správně?
Přesně tak. Data vidím normálně. Pokud tam není ta podmínka. Dá se to nějak převést do jiného Item? Mám tam ještě dva, ale ty nejsou vidět a jsou v nich textboxy. EditItem a InsertItem. Ve vlastostech je nastavení ItemType, nebude zrada tam?
Zkus si do toho FormView vložit ručně nějaký Label a v kódu mu zkus
přidat nějaké vlastnosti, jestli to bude fungovat.
Ještě mě napadlo, skutečně má ten label ID=MeasGlobalStatusLabel?
ID je v pořádku a přidaný Lebel funguje s prostým textem i s daty, ale ještě něco zkusím
Když přidám Label do FormView a dám ručně text - funguje.
Když přidám Label do FormView a zadám data - funguje.
Když přidám Label na stránku v kódu je vidět.
Když přidám Label do FormView v kódu není vidět a hlásí stejnou
chybu
protected void Page_Load(object sender, EventArgs e)
už jsem nad tím také uvažoval, jestli není chyba tady.
tak už jsem z toho srnec, daněk, jelen...
Já taky, už jsem snad vyzkoušel všechno. Když jsi to zkoušel, tobě to chodilo?
Když je nějaký prvek ve FormView, tak v kódu být vidět nemůže a
dostat se k němu lze jen přes "FindControl".
Zkusil jsi tomu ručně přidanému Labelu do FormView nastavit z kódu nějaký
text?
Pokud to nefunguje, pak mě už napadá jediné - zrušit tu stránku a založit
ji znovu od začátku...
Mě to přes FindControl funguje normálně.
Dneska už na to kašli. Zítra snad budeme moudřejší. Každopádně díky.
Ještě mě napadlo, jestli tam máš odchyceny všechny možnosti "textů",
které se mohou vyskytnout v tom labelu. Mohlo by to být tím, že podmínce
nevyhovuje nic a vyhodí to chybu..., to ale už 'vařím z vody'...
Teď jsem to zkoušel a normálně mi to funguje, text se v labelu ve FormView
barví, jak potřebuju...
Zruš tu stránku celou a založ jí znovu od začátku..., to musí
fungovat.
Jenom mně napadlo. V jaké verzi VS to děláš? Já mám VS 2013 Ultimate,
tedy FW 4.5.1.
Nemůže to být rozdílnými knihovnami FW?
Upravil jsem FW na 4.5. Chybu nevyhazuje, ale taky nebarví.
Udělal jsem úplně novou aplikaci s jednou stránkou a problém je stejný. Faktu už nevím.
Zkoušel jsem to i takhle a nic. Stejná chyba.
var statusLabel = FormView1.FindControl("MeasGlobalStatusLabel") as Label;
switch(statusLabel.Text)
{
case "Vyhovuje":
statusLabel.ForeColor = System.Drawing.Color.Green;
break;
case "Nevyhovuje":
statusLabel.ForeColor = System.Drawing.Color.Red;
break;
}
var statusLabel = FindControl<Label>(FormView1, "MeasGlobalStatusLabel");
private static T FindControl<T>(Control control, string id) where T : Control
{
if (control == null)
return null;
if (control.ID == id)
return (T)control;
return control.Controls.OfType<Control>().Select(c => FindControl<T>(c, id)).Where(c => c != null).FirstOrDefault();
}
Zdravím. Mám to napsáno takto:
public partial class SpotrebicDetail : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var statusLabel = FindControl<Label>(FormView1, "MeasGlobalStatusLabel");
statusLabel.Text = "Ahoj";
}
private static T FindControl<T>(Control control, string id) where T : Control
{
if (control == null)
return null;
if (control.ID == id)
return (T)control;
return control.Controls.OfType<Control>().Select(c => FindControl<T>(c, id)).Where(c => c != null).FirstOrDefault();
}
, ale vyhazuje to pořád chybu:
Odkaz na objekt není nastaven na instanci objektu.
Popis: Při provádění aktuálního webového požadavku došlo k neošetřené výjimce. Další informace o chybě a o jejím původu v kódu naleznete v trasování zásobníku.
Podrobnosti o výjimce: System.NullReferenceException: Odkaz na objekt není nastaven na instanci objektu.
Zdrojová chyba:
Řádek 17: var statusLabel = FindControl<Label>(FormView1,
"MeasGlobalStatusLabel");
Řádek 18:
Řádek 19: statusLabel.Text = "Ahoj";
Řádek 20:
Řádek 21:
Zdrojový soubor: g:\C#\Programování\2013\eli_elektro\eli_elektro\Spotr\SpotrebicDetail.aspx.cs Řádek: 19
Trasování zásobníku:
[NullReferenceException: Odkaz na objekt není nastaven na instanci
objektu.]
eli_elektro.Spotr.SpotrebicDetail.Page_Load(Object sender, EventArgs e) in
g:\C#\Programování\2013\eli_elektro\eli_elektro\Spotr\SpotrebicDetail.aspx.cs:19
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender,
EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+772
Ta chyba je v tom statusLabel.Text = "Ahoj"; To ahoj je tam jen zkušebně
a když to napíšeš takhle
(FormView1.FindControl("MeasGlobalStatusLabel") as Label).Text = "Ahoj"
tak to taky nejde?
Právě, že je:
<span style="color: black; font-size:large; text-align:right"><asp:Label ID="MeasGlobalStatusLabel" runat="server" Text='<%# Bind("MeasGlobalStatus") %>' /></span>
</td>
a bez toho "spanu" jsi to zkoušel, jestli se něco změní? Protože jestli tam ten span máš jen kvůli stylování toho labelu, tak to můžeš udělat přímo do "toho" labelu...
A já tvrdím, že tam není. Můžeme nad tím bádat, můžeme nad tím diskutovat, ale jednoduše tam není.
Pokud máš label definovaný ve FormView.ItemTemplate, tak se nevygeneruje, dokud do FormView nenavážeš data.
Takže jsou následující možnosti:
V tom html to je: MeasGlobalStatus:
<span id="MainContent_FormView1_MeasGlobalStatusLabel">Vyhovuje
</span>
Na ten Label odkazuji v události Page_Load, to bude asi brzo. Můžeš mi prosím poradit v jaké události bych na něj měl odkazovat?
Page_Load() se zavolá ve chvíli, kdy se nahrála stránka, takže obvykle bývají kontrolní prvky už k dispozici, ale stále před zpracováním událostí. OnPreRender() se volá až po zpracování událostí a často bývá výhodnější mít kód tam, záleží případ od případu.
Udělej si naprosto minimální Default.aspx s FormView, v něm binding a vyzkoušej, jestli ti to funguje. Pokud ne, pošli mi kód aspx i aspx.cs, abych ti tam mohl najít chybu. Nemám tušení, co tam děláš špatně.
Z trochu jiného soudku, magická metoda Page_Load() by se neměla používat, používej radši OnLoad(). Page_Load() je pozůstatek ASP, který do ASP.NET nepatří.
Je to v podstatě jedno, skoro všechny mají přes 1000 stránek a skoro všechny jsou o tom samém. Dříve jsem kupoval přes Amazon, což je už léta jednodušší díky německému Amazonu, dneska už kupuji pouze na Kindle. Knihy v češtině se nevyplatí.
http://www.webforms.cz/Tutorialy.aspx
je to sice ze starší verze, ale je tam mnoho užitečných rad...
Tak jsem udělal úplně jednoduchou aplikaci s jednou stránkou:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Zkoska1
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
var statusLabel = FindControl<Label>(FormView1, "StatusLabel");
if (statusLabel.Text == "Vyhovuje")
{
statusLabel.BackColor = System.Drawing.Color.Green;
}
else if (statusLabel.Text == "Nevyhovuje")
{
statusLabel.BackColor = System.Drawing.Color.Red;
}
}
private static T FindControl<T>(Control control, string id) where T : Control
{
if (control == null)
return null;
if (control.ID == id)
return (T)control;
return control.Controls.OfType<Control>().Select(c => FindControl<T>(c, id)).Where(c => c != null).FirstOrDefault();
}
}
}
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Zkoska1._Default" %>
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:TextBox ID="txbPrijmeni" runat="server"></asp:TextBox>
<asp:FormView ID="FormView1" runat="server" DataKeyNames="Id" DataSourceID="SqlDataSource1">
<EditItemTemplate>
Id:
<asp:Label ID="IdLabel1" runat="server" Text='<%# Eval("Id") %>' />
<br />
Jmeno:
<asp:TextBox ID="JmenoTextBox" runat="server" Text='<%# Bind("Jmeno") %>' />
<br />
Prijmeni:
<asp:TextBox ID="PrijmeniTextBox" runat="server" Text='<%# Bind("Prijmeni") %>' />
<br />
Mesto:
<asp:TextBox ID="MestoTextBox" runat="server" Text='<%# Bind("Mesto") %>' />
<br />
Status:
<asp:TextBox ID="StatusTextBox" runat="server" Text='<%# Bind("Status") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Aktualizovat" />
<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Storno" />
</EditItemTemplate>
<InsertItemTemplate>
Jmeno:
<asp:TextBox ID="JmenoTextBox" runat="server" Text='<%# Bind("Jmeno") %>' />
<br />
Prijmeni:
<asp:TextBox ID="PrijmeniTextBox" runat="server" Text='<%# Bind("Prijmeni") %>' />
<br />
Mesto:
<asp:TextBox ID="MestoTextBox" runat="server" Text='<%# Bind("Mesto") %>' />
<br />
Status:
<asp:TextBox ID="StatusTextBox" runat="server" Text='<%# Bind("Status") %>' />
<br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="Vložit" />
<asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Storno" />
</InsertItemTemplate>
<ItemTemplate>
Id:
<asp:Label ID="IdLabel" runat="server" Text='<%# Eval("Id") %>' />
<br />
Jmeno:
<asp:Label ID="JmenoLabel" runat="server" Text='<%# Bind("Jmeno") %>' />
<br />
Prijmeni:
<asp:Label ID="PrijmeniLabel" runat="server" Text='<%# Bind("Prijmeni") %>' />
<br />
Mesto:
<asp:Label ID="MestoLabel" runat="server" Text='<%# Bind("Mesto") %>' />
<br />
Status:
<asp:Label ID="StatusLabel" runat="server" Text='<%# Bind("Status") %>' />
<br />
</ItemTemplate>
</asp:FormView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT * FROM [Osoby] WHERE ([Prijmeni] = @Prijmeni)">
<SelectParameters>
<asp:ControlParameter ControlID="txbPrijmeni" Name="Prijmeni" PropertyName="Text" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</asp:Content>
Data v tabulce nemají žádný význam je to jen na zkoušku
Zobrazeno 50 zpráv z 55.