Autor Beitrag
Marshmallow
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 17.09.08 23:37 
Hallo Leute,

ich möchte gerne die Farbe der Zellen eines DataGridView basierend auf den Werten eines Arrays verändern. D.H. jedem Feld des DataGridViews ist ein Feld eines Arrays mit einer Prozentzahl zugeordnet. Je nach dem wie groß die Prozentzahl ist, soll die jeweilige Zelle im DataGridView eingefärbt werden. Da es sehr lange dauert die Prozentzahlen zu berechnen, gibt es mehrere Arrays mit vorberechneten Werten. Je nach verwendetem Array, sollen die Zellen des DataGridView also anders eingefärbt werden.

Der ToolTipText soll die zugeordnete Prozentzahl anzeigen.

Leider funktioniert das nicht so, wie ich mir das vorstelle. D.h. weder wird die gewählte Zelle angemalt, noch wird er richtige ToolTipText im DataGridview angezeigt.

Ich hoffe jemand von euch hat eine Idee, wo der Problem liegen kann. Auch wenn ihr einen Ansatz habt, wie man das ganze eleganter umsetzen kann, bin ich für Anregungen dankbar.

Hier Beispielcode, wie ich versucht habe das ganze umzusetzen.

Edit: Wurde in einem anderen Forum gelöst. Der Code stimmt soweit. Das Problem ist, dass das DataGridView asynchron gefüllt wird und die gesetzten Werte somit noch mal überschrieben werden. Das DataGridView Event DataBindingComplete kann verwendet werden, um das Problem zu umgehen.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
        public partial class MainForm : Form
  {
    DataTable testTable = new DataTable();
    float[,] testArray = new float [6,6];
    
    public MainForm()
    {
      //
      // The InitializeComponent() call is required for Windows Forms designer support.
      //
      InitializeComponent();
      
      // Table der im Datagridviev angezeigt wird. Bleibt immer gleich.
      testTable.Columns.Add("Spalte1");
      testTable.Columns.Add("Spalte2");
      testTable.Columns.Add("Spalte3");
      testTable.Columns.Add("Spalte4");
      testTable.Columns.Add("Spalte5");
      testTable.Columns.Add("Spalte6");
      
      testTable.Rows.Add(new string[]{"A","B","C","D","E","F"});
      testTable.Rows.Add(new string[]{"G","H","I","J","K","L"});
      testTable.Rows.Add(new string[]{"M","N","O","P","Q","R"});
      testTable.Rows.Add(new string[]{"S","T","U","V","W","X"});
      testTable.Rows.Add(new string[]{"Y","Z","#","!","?","%"});
      
      // Array mit Wert in Spalte 0, Reihe 1 > 30.0f
      // Hiervon soll es dann mehrere geben
      testArray = new float[6,6]{{30.0f,55.5f,30.0f,30.0f,30.0f,30.0f},
                  {30.0f,30.0f,30.0f,30.0f,30.0f,30.0f},
                  {30.0f,30.0f,30.0f,30.0f,30.0f,30.0f},
                  {30.0f,30.0f,30.0f,30.0f,30.0f,30.0f},
                  {30.0f,30.0f,30.0f,30.0f,30.0f,30.0f},
                  {30.0f,30.0f,30.0f,30.0f,30.0f,30.0f}};
      
      
      dataGridView1.DataSource = testTable;
      paintCellBackground(testArray);
    }
    
        /// <summary>
        /// Malt jede Zelle des DataGridViews grün, die die gleichen Koordinaten hat, wie das Feld/ die Felder des Arrays, dessen Wert größer als 30.0f ist. 
        /// </summary>
        /// <param name="testArray">Array mit der gleichen Anzahl an Feldern, wie der DataTable, der die DataSource für das DataGridView ist</param>
        /// <returns></returns>
    private void paintCellBackground(float[,] testArray)
    {
      for (int column=0; column<6; column++)
      {
          for (int row=0; row<6; row++)
          {
              DataGridViewCell cell = dataGridView1[column, row];
          cell.ToolTipText = testArray[column,row].ToString();
              // Der ToolTipText wird nicht angezeigt, auch wenn im Debugger zu sehen ist, dass er gesetzt wird. 
          if(testArray[column,row] > 30.0f)
          {
            // Die Zelle wird grün gemalt
            cell.Style.BackColor = System.Drawing.Color.Green;
            // Leider passiert das nicht, obwohl die richtige Zelle des DataGridView ausgewählt wird.
            // Hier im Beispiel die Zelle mit dem Wert "G". Zu sehen im Debugger.
            
          }    
          }
      }
    }
  }
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 18.09.08 09:23 
Wenn Du weiterhin Doppel-Posts machst (ich empfinde das sowieso als äußerst unhöflich, aber es gibt andere Helfer, die das nicht so eng sehen), dann informiere bitte künftig selbst, wenn Du wie hier eine Antwort bekommst. Jürgen
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 18.09.08 10:52 
user profile iconJüTho hat folgendes geschrieben:
Wenn Du weiterhin Doppel-Posts machst (ich empfinde das sowieso als äußerst unhöflich, aber es gibt andere Helfer, die das nicht so eng sehen), dann informiere bitte künftig selbst, wenn Du wie hier eine Antwort bekommst. Jürgen


Hat er doch in seinem Edit :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 18.09.08 13:17 
user profile iconChristian S. hat folgendes geschrieben:
Hat er doch in seinem Edit :gruebel:

Grrrrrrh :shock:

Nachdem ich den Hauptteil und den Code gesehen hatte, hatte ich mich sofort an die andere Diskussion erinnert, aber versäumt, den Beitrag nochmals vollständig zu lesen. Dabei habe ich dann das Edit übersehen. Ich bitte deshalb um Entschuldigung und ziehe den Vorwurf der Unhöflichkeit zurück (vorausgesetzt natürlich, dass das Edit vor meinem Beitrag erfolgte :mrgreen: ).

Stattdessen bitte ich jetzt darum, solche Lösungen in einem neuen Beitrag anzugeben: Das sorgt dafür, dass ein solcher Hinweis nicht überlesen wird, und außerdem dafür, dass die Diskussion nicht unter "bisher keine Antwort" läuft.

Gruß Jürgen
Marshmallow Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 18.09.08 17:28 
Ich habe meinen Post schon gestern kurz nachdem ich die Antwort bekommen habe editiert. Also mehr als neun Stunden vor deiner Antwort.

Außerdem habe ich den Thread auf Frage beantwortet gesetzt. Hätte dir durchaus auffallen können.

Was dagegen einzuwenden ist seine Probleme in zwei Foren zu posten verstehe ich nicht. Ich kann ja nichts dafür, dass du in beiden Foren aktiv bist. Wenn alle in beiden Foren aktiv wären bräuchte man ja wohl nur eins.

Des weiteren ist es entweder nicht möglich auf eigene Beiträge zu antworten oder ich habe den Antwortbutton gestern einfach nicht gefunden. Ich hatte nämlich das Editieren des Posts selbst nur als zweitbeste Lösung angesehen.

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst, das ist bei 1min Abstand die beste Lösung ;-)

Ok man kann auf eigene Posts antworten. Hab ich gestern nur übersehen ;)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 18.09.08 17:43 
Hallo!

Im Prinzip ist es kein Problem, wenn Du in zwei Foren fragst. Aber Du solltest die Threads gegenseitig verlinken. Das hat den Sinn, dass jemand in Forum A erstmal schauen kann, was in Forum B geschrieben wurde. Je nachdem, was dort geschrieben wurde, braucht er vielleicht gar nicht mehr antworten und spart sich die Mühe.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".