2009-07-27 7 views
1

I ableiten DataGridViewEx Klasse von Datagridview wie folgt aus:Datagridview-Autogeneratecolumns auf true gesetzt ist irgendwie

public class DataGridViewEx : DataGridView 
{ 
    // ... 

    [DefaultValue(false)] 
    [Browsable(true)] 
    public new bool AutoGenerateColumns 
    { 
     get { return base.AutoGenerateColumns; } 
     set { base.AutoGenerateColumns = value; } 
    } 

    public DataGridViewEx() 
    { 
     AutoGenerateColumns = false; 
    } 

    // ... 
} 

Aber, wenn ich meine DataGridViewEx Steuerelement zu einem Formular hinzufügen, ich sehe, dass Autogeneratecolumns-Eigenschaft auf true gesetzt ist! Mein Code setzt es nirgends auf "True", also "jemand anderes" :) setzt es auf "True". Natürlich wird der oben aufgeführte Code ausgeführt und AutoGenerateColumns wird für einen Moment auf false gesetzt, aber später wird er "wahr".

Irgendwelche Ideen?

Antwort

4

Ich heruntergeladen Quellen .NET zu debuggen .NET-Framework in der Lage sein, wie hier erklärt:
http://referencesource.microsoft.com/serversetup.aspx

Dann habe ich einen Haltepunkt auf DataGridView.AutoGenerateColumns Eigenschaft und fand heraus, dass es auf true im System eingestellt ist. Windows.Forms.Design.DataGridViewDesigner.Initialize() -Methode.
Ich öffnete diese Methode in Reflektor und sah wie folgt zusammen:

public override void Initialize(IComponent component) 
{ 
    ... 
    view.AutoGenerateColumns = view.DataSource == null; 
    ... 
} 

So, wie Datasource null ist, initialisieren() -Methode AutoGeneratedColumns auf true setzt :(

ich von DataGridViewDesigner meine eigenen Designer ableiten wollte Klasse dieses Verhalten außer Kraft zu setzen, aber DataGridViewDesigner ist intern, so kann ich nicht.

so wie es scheint, gibt es keine Möglichkeit, dieses Problem richtig zu lösen :(

2

Das ist leider zu erwarten. Da Sie AutogenerateColumns als new deklarieren, werden Aufrufe daran nicht virtualisiert. Wenn der übergeordnete Code AutogenerateColumns zu true festlegt, wird es nicht in Ihrem Property Setter weitergegeben. Während dies keine direkte Auswirkung auf das Verhalten hat (da Sie nichts tun, aber auf die übergeordnete Eigenschaft verzichten), tut Begrenzen Sie Ihre Fähigkeit zu debuggen, da Sie eine Console.WriteLine(Environment.StackTrace) oder etwas ähnliches in Ihrem tun können Setter.

Sie werden wahrscheinlich entweder ein Werkzeug wie Reflector verwenden müssen, um herauszufinden, wo es auf true gesetzt wird, aber das wird für alle außer den einfachsten Szenarien problematisch sein (zum Beispiel, wenn das Elternteil direkt die Trägervariable setzt)). Sie müssen wirklich einige Versuche und Fehler zu finden, wo der Wert gesetzt wird, dann rufen Sie Ihren AutoGeneratedColumns = false; Code. Ich würde OnCreateControl überschreiben und den Wert dort als Anfang prüfen.

2

Das war ein Problem für mich auch. Aus irgendeinem Grund verfügt die AutogenerateColumns-Eigenschaft über das Attribut [Browsable (false)], sodass sie im Designer nicht angezeigt wird. Um das zu umgehen, stelle ich sicher, dass im Konstruktor des Formulars, das das DataGridView-Steuerelement enthält, AutogenerateColumns = False gesetzt wird. Ich glaube, solange Sie dies tun vor Databinding, sollte es wie erwartet funktionieren.

2

Meine Lösung ist ganz einfach: durch OnAutoGenerateColumnsChanged zwingenden für Änderungen von AutoGenerateColumns beobachten und die Änderung zurück, wenn es unerwünscht ist: Control Designer

public class MyDataGridView : DataGridView 
{ 
    private bool mbAutoGenerateColumns = false; 

    [Browsable(true)] 
    [Category("Behavior")] 
    [DefaultValue(false)] 
    new public bool AutoGenerateColumns 
    { 
     get { return base.AutoGenerateColumns; } 
     set { base.AutoGenerateColumns = mbAutoGenerateColumns = value; } 
    } 

    public MyDataGridView() 
    { 
     // Set AGC to false right on the start 
     AutoGenerateColumns = false; 
    } 

    protected override void OnAutoGenerateColumnsChanged(EventArgs e) 
    { 
     base.OnAutoGenerateColumnsChanged(e); 

     // When AGC gets changed, check if the change happened 
     // internally or through the new property. 
     // If internally, revert! 
     // Since DGV has a tendency to enable AGC, only the setting 
     // to false is explicitly needed, the rest happens automatically 
     if(!mbAutoGenerateColumns && base.AutoGenerateColumns) 
      base.AutoGenerateColumns = false; 
    } 
} 

weiß, dass ich es ziemlich ein Hack, aber es funktioniert und da - erwähnt wie bisher - nicht ableitbar Es ist das Beste, was ich finden konnte.

Verwandte Themen