Autor Beitrag
Betasteter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP
C# (VS 2008)
BeitragVerfasst: Fr 09.09.11 13:58 
Ich versuche ein UserControl zu bauen, welches Daten gleichzeitig in einem DGV und einem MSChart Control darstellt.
Verschiedene Eigenschaften des DGV und des MSChart Controls möchte ich bearbeitbar lassen, zum Beispiel "DataSource", "Columns" vom Typ DataGridViewColumnCollection des DGV und "Series" vom Typ SeriesCollection des MSChart Controls.

Die DataSource Eigenschaft habe ich so deklariert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
[AttributeProvider(typeof(IListSource))]
[Browsable(true)]
[Description("Datenquelle")]
[DefaultValue(null)]
public object DataSource
{
  get
  {
    if (dgv.DataSource != nullreturn dgv.DataSource;
    return null;
  }
  set
  {
    dgv.DataSource = chart.DataSource = value;
  }
}

Die Series Eigenschaft des Chart Controls (selbes Problem auch bei der Columns Eigenschaft des DGV) wollte ich ähnlich deklarieren, allerdings ist die Eigenschaft am Chart Control schreibgeschützt, so dass ich den Setter nicht verwenden kann:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[Browsable(true)]
public SeriesCollection ChartSeries
{
  get
  {
    return chart.Series;
  }
}

Auf einem Testformular ist es möglich, diese Eigenschaften im Designer zu öffnen und zu bearbeiten, und nach einem Klick auf OK sind die Änderungen auch übernommen. Wenn ich das Testprojekt starte, sind die Änderungen jedoch nicht zu sehen.
Ein Beispiel:
Ich setze bei einigen Spalten des DGV "Visible" auf false, diese sind dann auch im Designer nicht zu sehen. Starte ich das Projekt, sind diese wieder sichtbar.
Weiteres Beispiel:
Ich setze die Eigenschaften der "Series1", zum Beispiel XValueMember und YValueMember. Öffne ich die Eigenschaften wieder, sind die Änderungen noch drin. Starte ich aber das Projekt, ist beim Debuggen festzustellen dass die Änderungen nicht übernommen wurden.
Was ist zu tun?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 09.09.11 14:28 
Hallo Betasteter,

da kann ich nur auf den Eintrag UserControl - Datagridview: Setzen von Properties aus dem myCSharp-Forum verweisen, da ich diesen Beitrag gerade heute morgen gelesen habe.

Kurz und knapp: der Designer speichert (standardmäßig) nur Eigenschaften der obersten Ebene.

Weitere Infos findest du evtl. unter Übersicht über die Designerserialisierung (im Detail habe ich mich damit aber auch noch nicht befaßt ;-))
Betasteter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP
C# (VS 2008)
BeitragVerfasst: Fr 09.09.11 14:50 
Hallo :-),

danke für die Antwort!
Ich versuche dann mal eine eigene Eigenschaften-Klasse zu bauen, die dann an das DGV/Chart weitergibt oder so.
Betasteter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

WinXP
C# (VS 2008)
BeitragVerfasst: Di 13.09.11 12:35 
Bin auf diesem Weg nicht weitergekommen, dasselbe Problem besteht weiterhin.

Erstmal noch ein paar Infos: Es geht um eine Tabelle, die unter anderem Datumsspalten enthält. Diese Tabelle wird im DGV angezeigt. Aus den Datumsspalten sollen dann Zeitbalken oder Punkte generiert werden, so dass zu jeder Datenzeile ein Zeitbalken nebendran sichtbar ist, der optimalerweise genauso hoch ist wie die Zeile im DGV. Also muss das Diagramm mit den Zeitbalken und Punkten scrollbar sein.

Per Code war es mir möglich, DGV und ein MS Chart Control ein Stückweit in der Darstellung zu synchronisieren, so dass die "RangeBars" in etwa neben den Datenzeilen zu sehen waren. Allerdings war das ziemlich umständlich, und nur der erste kleine Schritt. Daher bin ich dazu übergegangen, die Zeitbalken selbst zu zeichnen. Dafür gibt es (aus meiner Sicht) zwei Möglichkeiten:

1. Eine ungebundene Spalte dem DGV hinzufügen und dort zeichnen,
2. Splitcontainer, auf der einen Seite ein DGV, auf der anderen ein Panel oder so etwas, und dort zeichnen.

Möglichkeit 1 gefällt mir erstmal nicht so, ich möchte z.B. das Diagramm links oder rechts platzieren können oder den Bereich des DGV mittels eines Splitters vergrößern oder verkleinern. Diese Möglichkeit hat aber den Vorteil dass ich das UserControl von einem DGV ableiten könnte, so dass mir alle Properties des DGV erhalten bleiben.
Möglichkeit 2 favorisiere ich zurzeit, aus Gründen der Flexibilität.

Zwei Fragen:
Ist eine der beiden Vorgehensweisen sinnvoll? Wenn nicht, was könnte man noch tun?
Wenn ja, ist es ausreichend, auf dem Panel zu zeichnen? Es ist ein Steuerelement für WinForms.