Nietypowy problem z kontrolką Datagrid

0

Witam!

Moją aplikację dopadł jakiś paskudny błąd. Mam w niej 5 DataGridów, które do wczoraj działały poprawnie (a działały przez miesiąc). Dzisiaj uruchamiam środowisko i.... cyrki. W jednym DataGridzie nie działa zaznaczanie (tj. po kliknięciu nie widać żadnych ramek otaczających wiersz), w innym działa tylko zaznaczenie jednej komórki, a w jeszcze jednym wszystko chodzi jak by nigdy nic.

Testowane w środowiskach VC# 2010 i VStudio 2012 Express - dla obu efekt jest identyczny.

Właściwości każdego z DataGridów:

  • IsReadOnly = true
  • HorizontalAlignment = Stretch
  • VerticalAlignment = Stretch
  • Width = Auto
  • Height = Auto
  • SelectionMode= Single

Co można zrobić w takiej sytuacji? Nie za bardzo wiem jak szukać takie coś w Googlach, a dotychczasowe szukajki nic nie dały.

Zdesperowany
AlfaLeporis

1

Wrzuć projekt będzie łatwiej ogarnąć. :D

0

Poniżej zamieszczam link do kompletnego projektu:

https://www.dropbox.com/s/rfgi2ympbuia5oy/Librorum.rar

Tylko od razu zaznaczam, że do jego działania potrzebna jest baza danych MS SQL więc nie obrażę się jeżeli nikt mi nie odpowie :)

1

Nie patrzę w projekt bo mi się zwyczajnie nie chce. Po prostu z doświadczenia wiem, że błędy "nie wiadomo o co chodzi, ani skąd, ani po co i w ogóle WTF", wynikają z bardzo poważnych błędów programistycznych.

  • Wycieki pamięci. Bardziej dotyczy C++.
  • Błędne używanie wielowątkowości (przypuszczam, że tu może leżeć błąd o ile jej używasz).
  • Ustalanie parametrów komponentów w kodzie - w różnych dziwnych miejscach. Sam potem nie wiesz, że coś ustawiło Ci komponent według pewnych ustawień.
  • Coś leży na kontrolce i jest przezroczyste.
  • Komponent ma ustawiony locked.
  • Sprawdź czy zdarzenie podczas operacji się wywołuje.
  • Napisałeś własny datagrid, dziedziczący po starym i skopałeś zdarzenie OnPaint.
  • Blokujesz poszczególne kolumny, rekordy, komórki w kodzie.
  • Skopane podpinanie obiektów - DataSource. A przy tym propertisy boolowskie w obiektach.

Obstawiam, że to problem wielowątkowości mimo, że nie wiem czy jej używasz. Powodem mojego przekonania jest to, że aplikacja działała zgodnie z tym co napisałeś i nagle przestała. Powód w takim przypadku? Brak wiedzy jak wykorzystać wielowątkowość i zapobiec problemom.

0

Nie patrzę w projekt bo mi się zwyczajnie nie chce.

Słusznie, na Twoim miejscu zrobiłbym to samo :)

  • Wycieki pamięci. Bardziej dotyczy C++.

Bardzo wątpliwe - pomijając mechanizmy języka to jedyne problemy mogą występować przy wczytaniu zbyt dużej ilości informacji z bazy danych (a przy pustej bazie danych błąd jest)

  • Błędne używanie wielowątkowości (przypuszczam, że tu może leżeć błąd o ile jej używasz).

Wątków w zasadzie używam tylko przy logowaniu do bazy danych, więc w czasie faktycznego działania programu działa tylko jeden główny.

  • Ustalanie parametrów komponentów w kodzie - w różnych dziwnych miejscach. Sam potem nie wiesz, że coś ustawiło Ci komponent według pewnych ustawień.

Jedyne co robię w kodzie to podpinam dane do właściwości ItemsSource.

  • Coś leży na kontrolce i jest przezroczyste.

Byłoby widać w XAML'u

  • Komponent ma ustawiony locked.

Wszystkie ustawione przeze mnie właściwości są w pierwszym poście.

  • Sprawdź czy zdarzenie podczas operacji się wywołuje.

Nie ma reakcji na kliknięcie, chociaż tutaj się jeszcze upewnię bo do końca nie pamiętam.

  • Napisałeś własny datagrid, dziedziczący po starym i skopałeś zdarzenie OnPaint.

Nie

  • Blokujesz poszczególne kolumny, rekordy, komórki w kodzie.

Nie, wszystkie operacje są niemal identyczne dla każdego DataGrid'a.

  • Skopane podpinanie obiektów - DataSource. A przy tym propertisy boolowskie w obiektach.

Wątpie, ponieważ przez długi czas podpinanie działało i aplikacja się nie buntowała (a żadnych zmian nie wprowadzałem)

Obstawiam, że to problem wielowątkowości mimo, że nie wiem czy jej używasz. Powodem mojego przekonania jest to, że aplikacja działała zgodnie z tym co napisałeś i nagle przestała. Powód w takim przypadku? Brak wiedzy jak wykorzystać wielowątkowość i zapobiec problemom.

Tak jak mówiłem, raczej niemożliwy jest tutaj problem z wątkami. Ale w każdym razie dzięki za rozpiskę, jeszcze jutro sprawdzę kilka rzeczy.

1

A ja sobie spojrzałem.

Da się odpalić bez bazy danych ten Twój program. A co do twojego problemu to bruździ Ci funkcja:

private void tabControl1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//...
// A konkretnie te 3 linijki nie wiem po co to nie wczuwałem się ale założę się że bez sensu jest przeładowywać co cokolwiek w tym miejscu.
mAuthors.reloadStats();
mCategories.reloadStats();
mPublishers.reloadStats();
}

Bo kliknięcie na jakikolwiek nowy UI Control który znajdował się w TabControlu powodował przeładowanie twoich DataGridów. Więc w tym przypadku za każdym razem kliknięcie w DataGrid powodowało przeładowanie go więc zaznaczenie się gubiło. :P

0

@DibbyDum, wybawicielu, trafiłeś w samo sedno problemu :) Faktycznie już pamiętam, że wtedy pisałem te statystyki i musiałem dopisać ten kod. W każdym razie wszystko działa, będę kombinował inaczej z tym odświeżaniem.

AlfaLeporis

1 użytkowników online, w tym zalogowanych: 0, gości: 1