Hallo,
eigentlich ist es nicht erlaubt, mehrere Fragen in ein Topic zu packen, aber irgendwie gehören die Fragen zusammen und so ist denk ich besser, als 3 Topics aufzumachen 😉
1.
public int cpu
{
get { return appVersion; }
}
private int Cpu = "0";
In dem PropertyGrid soll der CPU-Verbrauch angezeigt werden. Da nur get da ist, ist diese Eigenschaft ReadOnly. Leider verändert sich daher die Farbe ins Graue, wie als wenn das Grid Enabled = false hätte. Was kann ich tun, damit die Farbe einfach schwarz bleibt?
2.
Unter dem Grid ist ja immer ein graues Rechteck, in dem Erklärungen zur jeweiligen Option stehen. Kann man das ohne größeren Aufwand wegbekommen? Im Moment ziehe ich das Grid einfach nach unten hin über die Form, aber das ist irgendwie .. Holzknüppel 🙂
Was auch ginge, wäre default einzustellen, dass das graue Rechteck in der kleinsten Einstellung ist.
OptionsPropertyGrid.SelectedObject = appset;
Das immer wiederholen? Oder gibts andere Wege?
lg
zu 3)
Das PropertyGrid hat eine Refresh()-Methode 🙂
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo Term!nX,
ich verstehe nicht, warum du alles in einen Thread schreibst. Alle Fragen sind komplett unabhängig von einander. Bitte mach beim nächsten Mal drei Threads.
zu 2. PropertyGrid.HelpVisible = false
herbivore
Entschuldige bitte, aber ich hatte ein wenig Hemmungen, 3 Threads zu eröffnen.
Danke für die Antworten 🙂
Hallo Term!nX,
zu 1. stehe ich erstmal keinen rechten Weg, denn eine direkte Einstellung der Farbe für ein bestimmtes Feld kenne ich nicht und selbst mit einem UITypeEditor kann man nur einen Teilbereich Feldes, in dem der Wert angezeigt wird, selbst zeichnen (PaintValue). Bliebe PropertyGrid.Paint und da weis man nicht, wo die genau Zeichenposition ist.
herbivore
Hallo Term!nX,
zu 1. Ein leerer Setter 🙂
Grüße,
psy
Hi!
Der leere Setter ginge theoretisch, allerdings ist es so dem user möglich, den angezeigten Wert äußerlich zu verändern. Tatsächlich kann er es nicht, aber er kann den angezeigten Wert beliebig ändern, das kommt irgendwie unprofessionell 😉
In der Class1 habe ich einen BG-Thread, der einen Wert, den das PropGrid anzeigt, immer ändert:
public void _change()
{
while (true)
{
Thread.Sleep(2000);
this.maxRepeatRate += 1;
}
}
public void change()
{
Thread t = new Thread(new ThreadStart(_change));
t.IsBackground=true;
t.Start();
}
Damit simuliere ich das Ändern der CPU-Auslastung.
In der Form-Klasse habe ich folgenden BG-Thread:
public void jo()
{
Thread t = new Thread(new ThreadStart(_jo));
t.IsBackground = true;
t.Start();
}
public void _jo()
{
while (true)
{
Thread.Sleep(100);
OptionsPropertyGrid.Refresh();
}
}
Hier ist also das Refreshen drin. Allerdings wird der angezeigte Wert nur geändert, wenn man auf die entsprechende Zeile im PropertyGrid klickt. Der angezeigte Wert müsste sich aber in der GUI ändern, ohne das man darauf klickt..
Und nochmal danke 🙂
Hallo Term!nX,
zu 3. klingt nach RefreshPropertiesAttribute (und das Aktualisierungsproblem bei einem leeren Setter, sollte könnte sich u.U. damit auch erschlagen lassen)
herbivore
Hi,
welches Attribut denn? Ich habe mal nachgeschlagen, und das hier gefunden:
[Category("Data")]
[Description("Indicates the source of data for the control.")]
[RefreshProperties(RefreshProperties.Repaint)]
http://msdn.microsoft.com/en-us/library/system.componentmodel.refreshpropertiesattribute.aspx
Laut beschreibung kann ich richtiger nicht sein, und repaint hört sich auch primär richtig an.
public partial class Form1 : Form
{
[Category("Data")]
[Description("Indicates the source of data for the control.")]
[RefreshProperties(RefreshProperties.Repaint)]
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Class1 appset = new Class1();
OptionsPropertyGrid.SelectedObject = appset;
OptionsPropertyGrid.HelpVisible = false;
appset.change();
}
public void jo()
{
Thread t = new Thread(new ThreadStart(_jo));
t.IsBackground = true;
t.Start();
}
public void _jo()
{
while (true)
{
Thread.Sleep(100);
OptionsPropertyGrid.Refresh();
}
}
Allerdings refresht das propgrid immer noch nicht, wenn der Wert geändert wird.
lg
Du kennst dich mit Attributen noch nicht so aus, oder?
Du mußt die Attribute immer oberhalb des entsprechenden Members deklarieren.
(In deinem Code hast du demnach die Attribute dem Konstruktor der Form1 zugewiesen).
Hi!
Hier ist also das Refreshen drin. Allerdings wird der angezeigte Wert nur geändert, wenn man auf die entsprechende Zeile im PropertyGrid klickt. Der angezeigte Wert müsste sich aber in der GUI ändern, ohne das man darauf klickt..
Und nochmal danke 🙂
Wenn ich Deinen Code anschaue, dann sieht es so aus, als würdest Du den Refresh aus einem NICHT-UI-Thread auslösen.... das ist ganz böse (und vermutlich auch der Grund wieso der Refresh keine Wirkung zeigt).
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hi Term!nX,
zu 3.) Wie Programmierhans schon sagte, muss Refresh vom GUI-Thread kommen.
Also entweder BeginInvoke oder Windows.Forms.Timer
RefreshProperties wird dein Problem nicht lösen, da dieses Attribute nur ein Repaint auslößt wenn sich ein Property im GRID ändert (und nicht in der Klasse selbst).
Grüße,
psy