2008-08-21 17 views
7

Ich entwickle ein Excel 2007-Add-In mit Visual Studio Tools für Office (2008). Ich habe ein Blatt mit mehreren ListObjects darauf, die beim Start an Datatables gebunden werden. Wenn sie gebunden sind, werden sie automatisch skaliert..NET - Excel-ListObject-Autosizing auf Datenbasis

Das Problem tritt auf, wenn sie neu gebunden werden. Ich habe eine benutzerdefinierte Schaltfläche in der Multifunktionsleiste, die zurück in die Datenbank und ruft verschiedene Informationen auf der Grundlage einiger Kriterien, die der Benutzer eingibt. Diese neuen Daten kommt zurück und wird an die Listobjects wieder gebunden - aber diesmal sind sie nicht geändert werden und ich erhalte eine Ausnahme:

Listobject nicht gebunden werden können, weil es kann die Daten nicht passen der Größe verändert werden. Das ListObject konnte keine neuen Zeilen hinzufügen. Dies kann daran liegen, dass Objekte unterhalb des Listenobjekts nicht verschieben kann.

Innere Ausnahme: "Insert-Methode der Range-Klasse ist fehlgeschlagen"
Grund: Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

Ich war nicht in der Lage etwas sehr sinnvoll zu finden Dieser Fehler bei Google oder MSDN. Ich habe versucht, das eine Weile herauszufinden, aber ohne Erfolg.

Basic-Code-Struktur:

//at startup 
DataTable tbl = //get from database 
listObj1.SetDataBinding(tbl); 
DataTable tbl2 = //get from database 
listObj2.SetDataBinding(tbl2); 

//in buttonClick event handler 
DataTable tbl = //get different info from database 
//have tried with and without unbinding old source 
listObj1.SetDataBinding(tbl);    <-- exception here 
DataTable tbl2 = //get different info from database 
listObj2.SetDataBinding(tbl2); 

Beachten Sie, dass diese Ausnahme tritt auf, selbst wenn die Listobject schrumpft, und zwar nicht nur, wenn es wächst.

Antwort

4

Wenn jemand anderes dieses Problem hat, habe ich die Ursache für diese Ausnahme gefunden. ListObjects wird beim Binden automatisch neu skaliert, solange sie keine anderen Objekte auf dem Blatt beeinflussen. Denken Sie daran, dass ListObjects nur die Bereiche beeinflussen kann, die sie umschließen.

In meinem Fall hatte das Listenobjekt, das über dem anderen war, weniger Spalten als das darunterliegende. Nehmen wir an, das oberste ListObject hatte 2 Spalten und das untere ListObject 3 Spalten. Wenn das oberste ListObject die Anzahl der Zeilen änderte, konnte es keine Änderungen an der dritten Spalte vornehmen, da es sich nicht in seinem zugrunde liegenden Bereich befand. Das bedeutet, dass keine Zellen in der dritten Spalte verschoben werden konnten. Daher konnte das zweite ListObject nicht ordnungsgemäß verschoben werden, was zu meiner Ausnahme oben führte.

Das Ändern der Positionen der ListObjects, um die breitere oberhalb der kleineren Position zu platzieren, funktioniert einwandfrei. Nach der obigen Logik bedeutet dies nun, dass das breitere ListObject alle Spalten des zweiten ListObject verschieben kann, und da es nichts unter dem kleineren gibt, kann es auch alle notwendigen Zellen verschieben. Der Grund, warum ich bei der anfänglichen Bindung keine Probleme hatte, ist, dass beide ListObjects eine einzelne Zelle waren.

Da dies in meinem Fall nicht optimal ist, werde ich wahrscheinlich leere Spalten verwenden oder versuchen, mit unsichtbaren Spalten zu spielen, wenn das möglich ist, aber zumindest ist die Ursache jetzt klar.

0

Nur eine Idee von etwas zu versuchen, um zu sehen, ob es Ihnen mehr Informationen gibt: Versuchen Sie, die Größe des Listenobjekts vor der Ausnahmelinie und sehen, ob das auch eine Ausnahme auslöst. Falls nicht, versuchen Sie, das Bereichsobjekt auf die neue Größe der DataTable zu skalieren.

Sie sagen, dass dies passiert, wenn das ListObject schrumpft und wächst. Kommt es auch vor, wenn das ListObject gleich groß ist?

1

Ich habe ein ähnliches Problem mit Refreshign mehrere Listobjects. Wir setzen jedes listObject.DataSource = null und binden uns dann erneut an das untere Listenobjekt und arbeiten uns aufwärts anstatt von oben nach unten.