Avatar billede agertoft Nybegynder
28. oktober 2004 - 19:28 Der er 19 kommentarer og
1 løsning

Problemer med DataList og værdier

Jeg har et spørgsmål vedr. DataBinder.Eval metoden. Jeg tror ikke helt jeg har brugt den rigtigt i nedenstående ;)

Problemet er, at jeg gerne vil manipulere med den data, i min DataTable som min DataList er bundet til - før jeg viser den. Jeg vil altså gerne have ganget, divideret, adderet og substraheret nogle tabel-værdier med hinanden. Det gør jeg på følgende måde:

<%# 1+(int)
(((double)DataBinder.Eval(Container.DataItem, "handicap") *

double.Parse(DataBinder.Eval(Container.DataItem, "slope_red_tee").ToString())/113) +

(double.Parse(DataBinder.Eval(Container.DataItem, "course_rating_yellow_tee").ToString()) -
                    double.Parse(DataBinder.Eval(Container.DataItem, "coursepar").ToString()))) >=
double.Parse(DataBinder.Eval(Container.DataItem, "hole_no").ToString()) ? "1" : "0" %>

Nu viser den altså værdien "1" eller "0" alt efter om min beregnede værdi er højere end en fast værdi jeg har i min DataTable. Problemet er, at jeg gerne vil have denne værdi til at være mere end 1, hvis bestemte betingelser er opfyldt. Altså hvis man kan dividere værdien "hole_no" op i den ovenstående beregning og resultatet giver mere end 2, så skal værdien fx være 2.

Jeg ved at det er noget sjusk ovenstående kode, men jeg ved ikke lige hvordan jeg gør det på en smartere måde. Hvordan får jeg mere struktur i min kode?

Det generelle problem er, at jeg gerne vil manipulere med al dataen inden det bliver vist i min DataList.
Avatar billede agertoft Nybegynder
28. oktober 2004 - 20:11 #1
Nu har jeg fået kigget lidt på ItemDataBound-eventen. Og det ser ud som om, at det er det, jeg skal have gang i. Men nu har jeg så et andet problem. Min metode ser således ud:

public void scorecardDataList_ItemDataBound(object sender, DataListItemEventArgs e)
{
  if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
  {
    lblAts1 = (Label)e.Item.FindControl("lblAtsl");
    Double Price = Convert.ToDouble(((DataRowView)e.Item.DataItem).Row.ItemArray[1].ToString());
    lblAts1.Text = Price.ToString("c");
  }
}

Men jeg får nu følgende fejl:

lblAts1.Text = Price.ToString("c");

at et sted i denne linje er objektet ikke initialiseret. Men det har jeg nu gjort - går ud fra at det er lblAts1 den brokker sig over...

Hvordan får jeg fat i mine kontroller så jeg kan manipulere med disse værdier inden de bliver vist for brugeren i denne event?
Avatar billede snepnet Nybegynder
28. oktober 2004 - 21:21 #2
hej agertoft :o)

lblAts1
og
lblAtsl

var det ikke meningen de skulle have heddet det samme ?

mvh
Avatar billede snepnet Nybegynder
28. oktober 2004 - 21:23 #3
Du har FindControl("lblAtsl")... mon ikke det er den der skulle have heddet FindControl("lblAts1") ?
mvh
Avatar billede agertoft Nybegynder
28. oktober 2004 - 21:38 #4
Jo :) Jeg opdagede det også og nu får jeg ikke fejlen længere. Jeg vil tillade mig at omformulere mit oprindelige spørgsmål, for ovenstående løsning er noget rod...

Min ItemDataBound ser nu således ud:

public void scorecardDataList_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
  if(e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
  {
    string ats = ((Label)scorecardDataList.Items[0].FindControl("lblAts1")).Text;
    ats += 5;
    ((Label)scorecardDataList.Items[0].FindControl("lblAts1")).Text = ats;
  }
}

Det jeg leder efter er bare, at jeg gerne vil have værdien på en label trukket ud, manipuleret med den og have den sat ind igen. Ovenstående virker ikke, men jeg tror du kan se, hvad det er jeg leder efter. Har du nogle forslag til, hvordan jeg gør?
Avatar billede snepnet Nybegynder
28. oktober 2004 - 21:52 #5
du kan ikke lægge 5 til en string... prøv denne :

Label label = (Label)scorecardDataList.Items[0].FindControl("lblAts1");
int ats = int.Parse(l.Text) + 5;
label.Text = ats.ToString();

mvh
Avatar billede snepnet Nybegynder
28. oktober 2004 - 21:54 #6
for øvrigt er det meget nemmere hvis du går direkte på argumentet e, sådan her :

Label label = (Label)e.Item.FindControl("lblAts1");
int ats = int.Parse(l.Text) + 5;
label.Text = ats.ToString();

(så får du det også gjort for alle linier)
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:06 #7
Den brokker sig over:

int ats = int.Parse(label.Text) + 5;

Input string was not in a correct format. Og hvis jeg lader ats være som en string og bare lægger en string mere til, så siger den, at objektet ikke er initialiseret. Det kan godt være, at det er mig der har stirret mig blind på den fejl ^^ men jeg kan simpelthen ikke finde den nu :)
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:10 #8
hvis den fejler på int.Parse er det fordi det der i forvejen står i din label ikke kan castes til en int.

prøv denne .... hvor det hele bare er strings.

Label label = (Label)e.Item.FindControl("lblAts1");
string ats = l.Text + " hej ";
label.Text = ats;

mvh
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:17 #9
Nu er jeg kommet ud over parse-problemet :)

Men nu får jeg fejl på følgende:

int ats = int.Parse(label.Text);

"Object reference not set to an instance of an object."

Hvad er det nu for en variabel der skal initialiseres? Det er da ikke label...?
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:20 #10
hov... det er fordi jeg sidder og kludrer, og prøver at kalde den samme variable hhv. label og l... en af delene må kunne gøre det :o)

Label label = (Label)e.Item.FindControl("lblAts1");
int ats = int.Parse(label.Text) + 5;
label.Text = ats.ToString();

mvh
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:21 #11
Jeg går ud fra at der skulle stå

string ats = label.Text + " hej ";

når du skriver:

string ats = l.Text + " hej ";

:) ?
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:21 #12
og så skal denne label (lblAts1) så stå i din template.
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:22 #13
hov - et lille kryds... jo præcis... undskyld jeg biksede rundt i det.
/snep
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:23 #14
Ja den står på følgende måde i mit ItemTemplate:

<asp:Label id="lblAts1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ats") %>'>
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:24 #15
Og er selvfølgelig afsluttet med </asp:Label> ;)
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:24 #16
jamen det er fint... lige inden det går helt galt det her.
er det kun tal der skal komme ud i den label - eller er det tekst ?
mvh
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:28 #17
Det er et tal...

I mit ItemTemplate hedder label "lblAts1" og i mit AlternatingItemTemplate hedder den "lblAts2", da jeg jo ikke kan give dem det samme ID. Men ifølge ovenstående kode er det jo så kun lblAts1 jeg vil manipulere med hele vejen igennem min DataList.
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:42 #18
det skulle der sådan set ikke være noget i vejen for - de kommer ikke "i vejen for hinanden".

men bortset fra det, så synes jeg det er meget sjældent at der er brug for en AlternatingItemTemplate... er det ikke bare en anden style du gerne vil have på hver anden række ?

f.eks. <AlternatingItemStyle BackColor="Aqua"></AlternatingItemStyle>

// og så lige for at få den med ;o)
Label label = (Label)e.Item.FindControl("lblAts1");
int ats = int.Parse(label.Text) + 5;
label.Text = ats.ToString();

mvh
Avatar billede agertoft Nybegynder
28. oktober 2004 - 22:47 #19
Jamen dog... Jeg fjernede mit AlternatingItemTemplate og mit SeparatorTemplate og så virkede det. Mystisk.

Jeg har tidligere fjernet de templates som jeg ikke mente, at jeg behøvede, men mener jeg fik en underlig fejl og så lod jeg det bare være. Men nu virker det. Cool. Tak for hjælpen endnu engang ;)

Lægger du et svar?
Avatar billede snepnet Nybegynder
28. oktober 2004 - 22:49 #20
et svar skal du få ;o)
vi ses
/snep
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester