Results 1 to 12 of 12

Thread: DbWebGrid (OnDrawDataCell)

  1. #1
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415

    DbWebGrid (OnDrawDataCell)

    Is het mogelijk om net als met een gewone Delphi win32 datagrid de inhoud van een cell te formatteren afhankelijk van de waarde van het overeenkomen dataveld?
    In Delphi win32 do ik dat in de OnDrawDtaCell - bv van een boolean een 'Ja' of 'Nee' maken, of van een integer een string maken afhankelijk van de waarde?
    Last edited by Anders; 11-Jun-04 at 12:05.
    Anders

    May your code compile!

  2. #2
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Ik probeer nu dit in de aspx bestand te zetten, maar hij geeft aan de, de variabel van de Funktie Hello niet een integer is. Hoe kan ik die converteren? naar Integer?
    Code:
    <asp:templatecolumn headertext="test">
       <itemtemplate>
         <asp:label runat="server" id="testlabel" 
         text='<%# Hello(DataBinder.Eval(Container.DataItem, "Vrij")) %>'/>
       </itemtemplate>
    </asp:templatecolumn>
    Anders

    May your code compile!

  3. #3
    Hoi,

    misschien met de Convert

    of
    Code:
    Int32.Parse(TextBox2.Text);
    Succes

  4. #4
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Code:
    <itemtemplate>
      <asp:label runat="server"
        text='<%# (Boolean)DataBinder.Eval(Container, "DataItem.Vrij") ? "Ja" : "Neen" %>'> </asp:label>
    </itemtemplate>
    All methodologies are based on fear. -- Kent Beck.

  5. #5
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Oeps

    Sorry - Ik had natuurlijk moeten terugmelden wat mijn oplossing was.

    Bedankt Dirk voor jouw code voorbeeld.

    Ik had zelf opgelost door in de "<itemtemplate>" tag een functie aan te roepen met een of merdere parameters uit de DataTable. bv. zo:
    Code:
    <asp:templatecolumn headertext="Nog beschikbaar">  
     <itemtemplate>
      <%# AantalVrij(DataBinder.Eval(Container.DataItem, "Vrij")) %>
     </itemtemplate>
    </asp:templatecolumn>
    
    function TWFPlaatsVrij.AantalVrij(Aantal: TObject): string;
    begin
     if Convert.ToInt32(Aantal) < 1 then
      Result:= 'Geen plaats ';
     if Convert.ToInt32(Aantal) = 1 then
      Result:= '1 plaats Vrij ';
     if Convert.ToInt32(Aantal) > 1 then
      Result:= '2 of meer plaatsen ';
    end;
    In een andere bepaal ik, aan de hand van een drie taal paremeters, welke "knop" in de column mowt komen en wat die knop moet doen. Dat werkt proma

    Maar toch ben ik niet helemaal te vreden, nu moet ik in "<itemtemplate>" tag een stuk C# code schrijven dat een functie aanroept. Maar dat is niet echt de "Delphi manier"
    Volgens mij moet het ook opgeloost kunnen worden in de "ItemDataBound" event van de DBWebGrid. Maar hoe?
    Anders

    May your code compile!

  6. #6
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Code:
    procedure TWebForm1.DataGrid1_ItemDataBound(sender: System.Object; e: System.Web.UI.WebControls.DataGridItemEventArgs);
    var
      s: string;
      B: System.Object;
    begin
      // Enkel List of Alternating aanvaarden voor display
      if not ((e.Item.ItemType = ListItemType.Item) or
         (e.Item.ItemType = ListItemType.AlternatingItem)) then Exit;
      // 'Vrij' is hier een Boolean die we ophalen :)
      // Je moet dit dus aanpassen voor het type in je eigen DB
      B := DataRowView(e.Item.DataItem).Row.Item['Vrij'];
      if B.Equals(DBNull.Value) then s := 'Misschien'
      else if Boolean(B) then s:= 'Ja'
      else s := 'Neen';
      // Derde kolom (beter opzoeken?)
      e.Item.Cells[2].Text := s;
    end;
    All methodologies are based on fear. -- Kent Beck.

  7. #7
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Andere manier (soort berekend veld): voeg een Column toe aan je DataSet (en een DataGridColumn aan je DataGrid om te visualiseren), en dan:

    Code:
    procedure TWebForm1.DataGrid1_DataBinding(sender: System.Object; e: System.EventArgs);
    begin
      DataSet1.Tables['Lid'].Columns['Berekend'].Expression :=
        'IIF(Vrij,''Ja'',IIF(NOT Vrij,''Neen'', ''Misschien''))';
      DataGrid1.DataSource := DataSet1;
      DataGrid1.DataMember := 'Lid';
    end;
    Deze methode heeft het nadeel dat de waarde berekend wordt voor alle rijen in de dataset, ook al toon je maar een fractie van die rijen.

    Noteer dat 'Vrij' in mijn geval nog altijd een Boolean is.
    All methodologies are based on fear. -- Kent Beck.

  8. #8
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Het resultaat is dan (heb 1 NULL toegevoegd voor de 'misschien'):
    Attached Images Attached Images  
    All methodologies are based on fear. -- Kent Beck.

  9. #9
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Code:
    1: procedure TWebForm1.DataGrid1_ItemDataBound(sender: System.Object; e: System.Web.UI.WebControls.DataGridItemEventArgs);
    2: var
    3:   s: string;
    4:   B: System.Object;
    5: begin
    6:   // Enkel List of Alternating aanvaarden voor display
    7:   if not ((e.Item.ItemType = ListItemType.Item) or
    8:      (e.Item.ItemType = ListItemType.AlternatingItem)) then Exit;
    9:   // 'Vrij' is hier een Boolean die we ophalen 
    10:  // Je moet dit dus aanpassen voor het type in je eigen DB
    11:  B := DataRowView(e.Item.DataItem).Row.Item['Vrij'];
    12:  if B.Equals(DBNull.Value) then s := 'Misschien'
    13:  else if Boolean(B) then s:= 'Ja'
    14:  else s := 'Neen';
    15:  // Derde kolom (beter opzoeken?)
    16:  e.Item.Cells[2].Text := s;
    17:end;
    Even door nemem om te zien of ik het goed heb begrepen ( dus niet )

    In regel 7 - 8 wil je controleren of de inhoudt van de cel van het grid hetzelfde is als het veld uit de database? Anders break je de procedure af.

    In regel 11 haal je de waarde uit de veld van de database. Maar waarom is "B" van het type "System.Object" en niet gewoon een boolean? En waar komt de "DataRowView" van aan? En hoe weet jij dat de Cursor van de datbase op de juiste rij staat?

    In regel 12 - 14 vul je de string "S" afhankelijk van de waarde van "B" en in Regel 16 stop je "S" in de juiste cell vn het grid.

    Ok heb ik het niet helemaal goed begrepen. Iedere geval bedankt voor je code voorbeeld.
    Anders

    May your code compile!

  10. #10
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Nog meer bedankt De laatste methode kan ook, maar als het op grote hoeveelheden gaan waarvan je maar een klein deel toont gaat mijn voorkeur uit naar de eerste.
    Anders

    May your code compile!

  11. #11
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Originally posted by Anders
    In regel 7 - 8 wil je controleren of de inhoudt van de cel van het grid hetzelfde is als het veld uit de database? Anders break je de procedure af.
    Neen, 7 en 8 : Event wordt getriggerd voor een Item of AlternatingItem, andere mogelijkheden zijn : Header, Footer, SelectedItem, Separator, Pager.
    Indien het geen Item of AlternatingItem is breek ik af.

    Originally posted by Anders
    In regel 11 haal je de waarde uit de veld van de database. Maar waarom is "B" van het type "System.Object" en niet gewoon een boolean? En waar komt de "DataRowView" van aan? En hoe weet jij dat de Cursor van de database op de juiste rij staat?
    B is niet van het type Boolean omdat het in dit voorbeeld ook NULL kan zijn.
    De DataRowView is gewoon het type van het e.Item.DataItem.
    De "cursor" is niet echt een cursor, maar gewoon een index in de dataset. Die staat goed net vanwege de databinding. Maar je hoeft daar niet op te rekenen: e.Item heeft ook een property DataIndex en dat is de index van het DataGridItem object in de bound data source.
    Originally posted by Anders
    In regel 12 - 14 vul je de string "S" afhankelijk van de waarde van "B" en in Regel 16 stop je "S" in de juiste cell vn het grid.
    Ja, dat klopt.

    Noteer dat je niet hoeft de achterliggende data source aan te spreken.
    Je kan ook de waarde van de cellen van het datagrid aanspreken en daar op testen.
    All methodologies are based on fear. -- Kent Beck.

  12. #12
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Ik begin stilletjes aan licht aan de eind van de tunel te zien - nogmaals bedankt
    Anders

    May your code compile!

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. DBWebGrid Refresh?
    By Slaaaa`aj in forum .NET
    Replies: 11
    Last Post: 06-Jan-05, 18:33
  2. Replies: 3
    Last Post: 25-Aug-04, 23:56
  3. Replies: 9
    Last Post: 25-May-04, 14:55

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •