Value Eigenschaft und Anzeige Zellenwert Embedded Control

Hier werden Fragen zur Programmierung des ppsGrids...
Post Reply
eoe
Posts: 38
Joined: 17.04.2007, 15:02
Spamschutz: 10
Location: Oedheim

Value Eigenschaft und Anzeige Zellenwert Embedded Control

Post by eoe »

Hallo Torsten,

nach einiger Zeit mal wieder eine kleine Frage von mir. Ich habe meine Grids in der Art erweitert, so dass ich in der ersten Spalte eine Checkbox integriert habe. Ändert sich deren Wert, so sollen sich auch alle Werte von untergeordneten Knoten mit ändern. Ich habe es mir jetzt mal sehr einfach gemacht und folgenden kleinen Algo verwendet, der das Grid traversiert, und dann einfach die Value Eigenschaft der entsprechenden Zelle auf true setzt.

Code: Select all

protected virtual void verarbeiteStatusUntergeordnetePositionenBeiCheckChange(bool check, GridRow row)
		{
			if (Cols[sCheck] != null )
			{
				if ( row != null)
				{
					GridRow next = row.Outline.FirstChild;
				
					while (next != null )
					{
						if ( next.Outline.Count > 0 )
						{
							verarbeiteStatusUntergeordnetePositionenBeiCheckChange(check, next);
						}

						if ( next.Enabled != eBoolean.False )
						{
							next[sCheck].Value = true;													
						}

						next = next.Outline.NextRow;
					}		
				}		
			}
		}
Allerdings hat das leider keine Auswirkung auf die Anzeige. Nur in einigen Fällen (so nach etwa 5 – 10 Änderungen einer Checkbox), ändern sich die Kinder mit. Woran kann das liegen? Ist es überhaupt richtig, hier über die Value Eigenschaft der Zelle zu gehen, oder muss ich direkt auf das Emmbedded Control zugreifen?

Danke und Gruß

Erik

torsten
Site Admin
Posts: 92
Joined: 02.05.2006, 09:04
Spamschutz: 10
Location: Bremen

Post by torsten »

Hallo Erik

Mit dem Demo bis du viel zu kompliziert :-)

Code: Select all

protected virtual void verarbeiteStatus(bool check, GridRow row){
  if(Cols[sCheck] != null ){
    if(row != null){
      for(int rw=row.Row+1;rw<Rows.Count;rw++){
        GridRow next=this.Rows[rw];

        if(next.Outline.Level>row.Outline.Level){
          if(next.Enabled!=eBoolean.False)
            next[sCheck].Value = true; // kommt da nicht 'check' rein ?
        }
        else
          break;
      }
    }
  }          
}
Einfach alle Zeilen unterhalb der angeklickten abändern, solange der Level größer ist als der Level der angeklickten Zeile.
Das war's.
Bei deinem Demo werden die Checkboxen wegen 'rekursivität' mehrfach angeklickt.

Gruß Torsten

PS.: Die Zeilen sind freihand kodiert. Fehler nicht ausgeschlossen

eoe
Posts: 38
Joined: 17.04.2007, 15:02
Spamschutz: 10
Location: Oedheim

Post by eoe »

Hallo Torsten,

danke für den Tipp. Allerdings sehe ich immer noch nicht, dass sich die Checkbox der untergeordneten Knoten ändert. Bei einem Click ändert sich nur die Zelle, die angewählt wird. Bei den anderen ändert sich die anzeige nicht, obwohl der Wert richtig gesetzt ist.

Was muss ich tun?

Danke

Erik

torsten
Site Admin
Posts: 92
Joined: 02.05.2006, 09:04
Spamschutz: 10
Location: Bremen

Post by torsten »

Hallo Erik

Hast du die Checkbox über "ControlEditInfo.Control" verbunden ?
Welche Eigenschaft hast du unter "ControlEditInfo.PropertyName" gesetzt ?

Gruß Torsten

eoe
Posts: 38
Joined: 17.04.2007, 15:02
Spamschutz: 10
Location: Oedheim

Post by eoe »

Hallo Torsten,

ich denke, ich mache soweit alles richtig.

Code: Select all

CheckBox c2 = new CheckBox();
					c2.CheckedChanged += mOnAuswahlCheckChanged;
					c2.Appearance = Appearance.Button;
					row[key].ControlEditInfo.Control = c2;
					row[key].ControlEditInfo.PropertyName = "Checked";
Aber keine Garantie...

Erik

torsten
Site Admin
Posts: 92
Joined: 02.05.2006, 09:04
Spamschutz: 10
Location: Bremen

Post by torsten »

Hallo Erik

Heute morgen hab' ich ein kleines Demo geschrieben:

Code: Select all

    private void cbox_CheckedChanged(object sender, System.EventArgs e) {
      CheckBox cbox=(CheckBox)sender;
      int row=grid.FocusCell.Y;
     
      for(int rw=row+1;rw<grid.Rows.Count;rw++){
        if(grid.Rows[rw].Outline.Level>grid.Rows[row].Outline.Level)
          grid["colCheck",rw].Value=cbox.Checked;
        else
          break;
        }
      break;
      }
    }
Wenn du auf jeden Klick reagieren willst, darfst du nicht den Value-Wert der Zelle verwenden, sondern musst den Check-Wert der Checkbox benutzen.
Der Value-Wert der Zelle wird erst erneuert, wenn der "Edit"-Modus beendet wird (spr., wenn das Steuerelement den Fokus verliert und das "AfterEdit"-Eregnis auftritt). Die Verbindung zwischen der Checkbox und der dazugehörigen Zelle bekommst du immer über die Fokuszelle (da ja nur eine Zelle aktiv sein kann).

Das gilt für alle "Embedded Controls": Wenn du auf Ereignisse des Controls reagieren möchtest (als sei das Controls irgendwo auf dem Formular), dann fragst du das Control selbst ab und stellst dann die Verbindung zum Grid bzw. zur Zelle mittels Fokuszelle her. Bsw. kannst du bei einer Textbox die Text-Eigenschaft als "PropertyName" angeben, zusätzlich aber auch über das "TextChanged"-Ereignis Einfluß auf die Zelle nehmen. Das macht das ganze ziemlich flexilbel. Aufpassen muss man dann nur, das durch "rekursivitäten" man sich selbst nicht "durch die Brust ins Auge piekst". :-)

Gruß Torsten

eoe
Posts: 38
Joined: 17.04.2007, 15:02
Spamschutz: 10
Location: Oedheim

Post by eoe »

Hallo Torsten,

irgendwie steht bei mir gerade der Elefant auf der Leitung. Ich habe jetzt die Sachen umprogrammiert und direkt auf die Checkboxen zugegriffen sowie die Events bei rekursiven Aufrufen unterdrückt.

Allerdings bekomme ich die Anzeige der "Häckchen" erst dann, wenn ich nach der Aktion an eine beliebige Stelle im Grid clicke. Ich stelle mich wahrscheinlich gerade etwas dumm an, aber ich stehe voll auf dem Schlauch.

Danke und Gruß

Erik

torsten
Site Admin
Posts: 92
Joined: 02.05.2006, 09:04
Spamschutz: 10
Location: Bremen

Post by torsten »

Hallo Erik
Mmmh, eigentlich ist das ganze doch garnicht soooo kompliziert, oder ?
Nochmal als ganzes...

Code: Select all

namespace CtrlOutline {
  public partial class Form1: Form {
    public Form1() {
      InitializeComponent();

      GridRow row;
      Random rnd = new Random();

// eine Checkbox zur Eingabe
      CheckBox cbox = new CheckBox();
      cbox.Dock = DockStyle.Fill;
      cbox.CheckAlign = ContentAlignment.MiddleCenter;

      grid1.Cols["colCheck"].ControlEditInfo.Control = cbox;
      grid1.Cols["colCheck"].ControlEditInfo.PropertyName = "Checked";
      cbox.CheckedChanged += new System.EventHandler(chk_CheckedChanged);

// eine Checkbox zur Anzeige
      cbox = new CheckBox();
      cbox.Dock = DockStyle.Fill;
      cbox.CheckAlign = ContentAlignment.MiddleCenter;
      grid1.Cols["colCheck"].ControlDisplayInfo.Control = cbox;
      grid1.Cols["colCheck"].ControlDisplayInfo.PropertyName = "Checked";

// grid vorbereiten
      grid1.BeginUpdate();
      grid1.AddRows(10);
      grid1.Cells["colNo", 0].Value = "Nr.";
      grid1.Cells["colOutline", 0].Value = "Outline";
      grid1.Cells["colCheck", 0].Value = "Check";

// zufällige Baumstruktur erzeugen
      int y = grid1.FixedRowCount;
      while (y < grid1.Rows.Count) {
        row = grid1.Rows[y];
        if (rnd.Next(10) > 2 + row.Outline.Level)
          row.Outline.AddChilds(rnd.Next(8 - row.Outline.Level) + 1);

// Checkbox per Zufall an/aus
        grid1.Cells["colCheck", y].Value = (rnd.Next(2) == 0 ? false : true);
        y++;
      }
      grid1.EndUpdate();
    }

// Checkbox wurde geklickt, auf andere Checkboxen erweitern
    private void chk_CheckedChanged(object sender, System.EventArgs e) {
      CheckBox cbox = (CheckBox)sender;
      int row = grid1.FocusCell.Y;

      grid1.BeginUpdate();
      for (int rw = row + 1; rw < grid1.Rows.Count; rw++) {
        if (grid1.Rows[rw].Outline.Level > grid1.Rows[row].Outline.Level)    // child der angeklickten Zeile ? 
          grid1["colCheck", rw].Value = cbox.Checked;                                       // Value's setzen durch angeklickte Checkbox
        else
          break;
        grid1.EndUpdate();
      }
    }
  }
}
Wenn es nicht funzt oder du das alles nicht so richtig verstanden hast, dann schreib' mal, wo dein Elefant auf dem Schlauch steht...
Das gesamte Projekt schick' ich dir noch per Mail....
Gruß Torsten

eoe
Posts: 38
Joined: 17.04.2007, 15:02
Spamschutz: 10
Location: Oedheim

Re: Value Eigenschaft und Anzeige Zellenwert Embedded Control

Post by eoe »

Hallo Torsten,

sorry für die späte Antwort. Ich war etwas Land unter und konnte mich nicht weiter um das hier beschriebene Problem kümmern. Wollte aber auch nur sagen, dass ich mir die Sache am WE angesehen habe und es jetzt richtig gut funktioniert.

Vielen Dank für deine (wie immer) prima Unterstützung!!!

Erik

Post Reply