2008-08-21 15 views
7

Zajmuję się przygotowaniem dodatku Excel 2007 za pomocą Visual Studio Tools for Office (2008). Mam jeden arkusz z kilkoma obiektami ListObject, które są związane z datatables podczas uruchamiania. Kiedy są związani, automatyzują się poprawnie..NET - Autoryzacja listy obiektów programu ListView w bazie danych

Problem pojawia się, gdy są ponownie powiązane. Mam przycisk niestandardowy na pasku wstążki, który powraca do bazy danych i pobiera różne informacje na podstawie pewnych kryteriów wprowadzanych przez użytkownika. Te nowe dane wraca i jest ponownie związany z ListObjects - jednak tym razem nie są one zmniejszane i uzyskać wyjątek:

ListObject nie może być związany ponieważ nie może być zmieniany w celu dopasowania danych. Obiekt ListObject nie mógł dodać nowych wierszy. Może to być spowodowane brakiem możliwości przenoszenia obiektów poniżej obiektu listy .

wyjątek wewnętrzny: "Włóż metoda klasy zasięgiem failed"
Powód: Microsoft.Office.Tools.Excel.FailureReason.CouldNotResizeListObject

nie udało mi się znaleźć coś bardzo sensowne na ten błąd w Google lub MSDN. Próbowałem to rozgryźć przez chwilę, ale bezskutecznie.

Podstawowa struktura kodu:

//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); 

Zauważ, że ten wyjątek występuje nawet wtedy, gdy ListObject kurczy się, a nie tylko wtedy, gdy rośnie.

Odpowiedz

4

Jeśli ktoś inny ma ten problem, znalazłem przyczynę tego wyjątku. Obiekt ListObjects automatycznie zmieni rozmiar wiązania, o ile nie wpłynie to na żadne inne obiekty na arkuszu. Należy pamiętać, że obiekty ListObjects mogą wpływać tylko na zakresy, które zawijają.

W moim przypadku obiekt listy, który znajdował się nad drugim, miał mniej kolumn niż ten znajdujący się pod nim. Powiedzmy, że najwyższy obiekt ListObject miał 2 kolumny, a dolny obiekt ListObject miał 3 kolumny. Gdy najwyższy obiekt ListObject zmienił liczbę wierszy, nie był w stanie wprowadzić żadnych zmian w trzeciej kolumnie, ponieważ nie znajdował się w ukrytym zakresie. Oznacza to, że nie mógł przesuwać żadnych komórek w trzeciej kolumnie, więc drugi obiekt ListObject nie mógł zostać poprawnie przeniesiony, co spowodowałoby mój wyjątek powyżej.

Zmiana położenia obiektów ListObjects w celu umieszczenia szerszego niż ten mniejszy działa poprawnie. Zgodnie z powyższą logiką, oznacza to teraz, że szerszy obiekt ListObject może przesuwać wszystkie kolumny drugiego obiektu ListObject, a ponieważ nie ma niczego poniżej mniejszego, może również przesuwać dowolne komórki. Powodem, dla którego nie miałem żadnych problemów z początkowym wiązaniem, było to, że obie obiekty ListObject były pojedynczą komórką.

Ponieważ nie jest to optymalne w moim przypadku, prawdopodobnie użyję pustych kolumn lub spróbuję bawić się niewidzialnymi kolumnami, jeśli jest to możliwe, ale przynajmniej przyczyna jest teraz jasna.

0

Po prostu pomysł na coś, aby sprawdzić, czy daje on więcej informacji: Spróbuj zmienić rozmiar obiektu listy przed linią wyjątku i zobacz, czy to również zgłasza wyjątek. Jeśli nie, spróbuj zmienić rozmiar obiektu zakresu na nowy rozmiar DataTable.

Mówisz, że tak się dzieje, gdy obiekt ListObject kurczy się i rośnie. Czy dzieje się tak również wtedy, gdy obiekt ListObject pozostaje tej samej wielkości?

1

Mam podobny problem z odświeżaniem wielu list obiektów. Ustawiamy każdy listObject.DataSource = null, a następnie ponownie wywołujemy zaczynając od dolnej listy i pracując w górę zamiast z góry na dół.