2017-04-08 6 views
0

Ich habe SQL-Tabelle dbo.Clicks die wie folgt aussieht:Jede Gridview-Zelle einzeln füllen und bemalen?

ColNum  Color  RowNum  Message 
1    Gold   1    Text1 
1    Black  2    Text2 
2    Red   2    MoreText 
2    Blue   3    TextX 

Meine gespeicherte Prozedur gibt diese gleichen Daten wie folgt. Dies wird Basiswert datatable:

Col1   Col2 
----------------------- 
Gold   (null) 
Black   Red 
(null)  Blue 

Ich fülle jede Zelle in RowDataBound:

protected void GridViewClicks_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     foreach (TableCell cell in e.Row.Cells) 
     { 
      cell.BackColor = ConvertFromHexToColor(cell.Text); 
     } 
    } 
} 

Dieser Code funktioniert, weil es die Zellen mit dem entsprechenden Hintergrundfarbe füllt.

Das Problem ist jetzt, dass ich auch den Inhalt meiner SQL-Tabelle [dbo.Clicks] in jeder Zelle anzeigen muss. Und da stecke ich fest.

Eine Alternative ist, dass jede Datentabelle die Farbe und den Text enthält, etwa so, wenn ich die Beispieldaten verwende. Dann analysiere ich es:

Col1   Col2 
Gold/Text1 (null) 
Black/Text2 Red/MoreText 
(null)  Blue/TextX 

Aber ich denke, es eine elegantere Art und Weise, dies zu tun sein muß. Für mich ist diese Lösung ziemlich hässlich.

Mein gridview sieht wie folgt aus:

<asp:GridView ID="GridViewClicks" runat="server" ShowHeader="False" onrowdatabound="GridViewClicks_RowDataBound"> 
</asp:GridView> 

Dank.

Antwort

2

Sie können die DataRowView im OnRowDataBound Ereignis verwenden und holen Sie sich die einzelnen Werte aus einer Zeile und wenden Sie sie an sie zu bestimmten Zellen.

if (e.Row.RowType == DataControlRowType.DataRow) 
{ 
    //cast the dataitem back to a datarowview 
    DataRowView row = e.Row.DataItem as DataRowView; 

    //use the data from the datarowview to specify color and contents for specific cells 
    e.Row.Cells[0].BackColor = Color.FromName(row["Color"].ToString()); 
    e.Row.Cells[0].Text = row["RowNum"].ToString(); 
    e.Row.Cells[1].BackColor = Color.FromName(row["Color"].ToString()); 
    e.Row.Cells[1].Text = row["Message"].ToString(); 
} 

UPDATE

Wenn die Gridview 3 Spalten, und die Datasource-6, mit wechselnden Text/Farbwerte können Sie eine Schleife

if (e.Row.RowType == DataControlRowType.DataRow) 
{ 
    //cast the dataitem back to a datarowview 
    DataRowView drv = e.Row.DataItem as DataRowView; 

    //loop all the items in the datarowview (not equal to columns in grid) 
    for (int i = 0; i < drv.Row.ItemArray.Length; i++) 
    { 
     //check if it is an uneven column 
     if (i % 2 == 0) 
     { 
      e.Row.Cells[i/2].Text = drv[i].ToString(); 
     } 
     else 
     { 
      e.Row.Cells[i/2].BackColor = Color.FromName(drv[i].ToString()); 
     } 
    } 
} 
+0

Danke für die Antwort. Ich habe bemerkt, dass du einen festen Wert für die 'Zellen' festlegst. Ich weiß nicht, wie viele Spalten die Datentabelle haben wird. Würde deine Antwort noch funktionieren? – rbhat

+0

Das hängt eher davon ab, wie die Spalte und ihre Farben von der Datenquelle empfangen werden. Wenn es "Text, Farbe, Text, Farbe" usw. ist, können Sie eine Schleife im rowdatabound-Ereignis erstellen, das jede Zelle -1 "färbt". – VDWWD

+0

Ich habe meine Antwort mit einem einfachen Beispiel aktualisiert. – VDWWD

1

Sie können Vorlagenfelder mit Beschriftungen verwenden und das Attribut style mit Eval zuweisen.

public class SomeData 
    { 
     public string Data1 { get; set; } 
     public string Data2 { get; set; } 

     public string Color1 { get; set; } 

     public string Color2 { get; set; } 

    } 

List<SomeData> lstData = new List<SomeData>() 
      { 

       new SomeData() {Data1 = "AAA", Color1 = "Red", Data2 = "ZZZ", Color2 = "Green"}, 
       new SomeData() {Data1 = "BBB", Color1 = "Blue", Data2 = "PPP", Color2 = "Gold"}, 
       new SomeData() {Data1 = "CCC", Color1 = "Red", Data2 = "ZZZ", Color2 = "Yellow"}, 

      }; 

      grdView.DataSource = lstData; 
      grdView.DataBind(); 

erstellen Gridview mit Schablonenfeld wie unten

<asp:GridView runat="server" ID="grdView" AutoGenerateColumns="False" > 
     <Columns> 
      <asp:TemplateField HeaderText="Data1"> 
      <ItemTemplate> 
       <asp:Label ID="lblColor1" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data1") %>' style= <%# String.Concat("background-color:",Eval("Color1")) %> ></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Data2"> 
      <ItemTemplate> 
       <asp:Label ID="lblColor2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Data2") %>' style= <%# String.Concat("background-color:",Eval("Color2")) %>></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

Dieses Bit wird für Sie den Trick

style= <%# String.Concat("background-color:",Eval("Color2")) %> 

This is how your gridview will look like

+0

Danke für die Antwort erstellen. Würde dies mit der SQL-Server-Tabelle oder der Datentabelle funktionieren? Berücksichtigt das auch, dass ich nicht weiß, wie viele Spalten es geben wird? – rbhat

+0

Es wird mit Daten aus jeder Datenquelle arbeiten. Sie müssen die Anzahl der Spalten wissen, da gridview über Vorlagenfelder verfügt, die Sie für jede Spalte in Ihrer Datenbanktabelle angeben müssen. . – Hakunamatata

Verwandte Themen