2013-04-23 13 views
7

Mam świadomość, że plik .designer.cs zawiera dane wygenerowane przez wizualnego projektanta formularzy w Visual Studio. Jednak mam kilka dodatkowych metod, które również chcę wstawić do pliku .designer.cs, ponieważ są one odpowiedzialne za obsługę formularzy niższego poziomu (na przykład elementy mojego menedżera stanu wizualnego).Ręczne edytowanie pliku * .designer.cs

Metoda w pliku InitializeComponent w pliku zawiera komentarz stwierdzający, że jest on generowany automatycznie i nie powinien być modyfikowany przez użytkownika. Czy to ograniczenie dotyczy tylko tej metody, czy nie powinien w ogóle edytować pliku .designer.cs? Zauważyłem, że między innymi zawiera on metodę Dispose(), którą użytkownik może zmodyfikować - co sugeruje pierwszą opcję. Chcę jednak być pewien.

+1

Gdy trzeba zmodyfikować formularz, wyślij metodę, * wyciąć * ją z pliku .designer.cs do pliku .cs. –

+0

można znaleźć kompletne wyjaśnienie tutaj [pełny opis] [1] [1]: http://stackoverflow.com/questions/32157898/how-to-use-resources-manually-in- cno-ide-act – Mehdi

Odpowiedz

10

Nigdy nie należy modyfikować .designer.cs. Kropka. Twoje zmiany zostaną nadpisane bez litości.

Aktualizacja: się być nieco bardziej pomocne, C# od v3 (VS 2008) włączyła metody częściowych, które wielu projektantów będą teraz używać do pozwalają realizować niestandardowe zachowanie.

+0

+1 exacly! kod w tych plikach zostanie zastąpiony, gdy tylko użyjesz programu Visual Studio do wyświetlenia układu formularzy. –

+0

Pod względem technicznym odnosisz się do częściowych _klasses_.Częściowe metody to zupełnie inna bestia. –

+2

@JensKloster Ammmm ... nie. Nie są one nadpisywane - pytam, ponieważ faktycznie mam projekt z edytowanymi plikami .designer.cs i do tej pory nie miałem żadnych problemów (nawet zmodyfikowałem formularze i moje metody wprowadzone do pliku .designer.cs nie zostały usunięte). Ale jeśli istnieje możliwość, że mogą, wolałbym przenieść je do osobnego pliku. – Spook

4

ta instrukcja dotyczy całego pliku designer.cs. Ponieważ cały kod w nim napisany jest generowany automatycznie.

Nie należy robić żadnych zmian w tym pliku, ponieważ może być odtworzone w każdej chwili ... To usunie swoje metody ...

Jeśli chcesz zachować kod oddzielone od pliku z kodem formularz, a następnie I proponuję utworzyć inny plik zawierający częściowej klasy, gdzie można umieścić wszystkie te metody ...

nadzieję, że to pomaga ...

0

Częściowa klasy forma projektant jest używany przez Visual Studio do umieszczenia kodu wszystkie potrzeby kompilacji kontrola.

Metoda InitializeComponent() nie może być nadpisana: jest używana przez edytor projektantów do renderowania podglądu formularza! Wypróbuj nowy projekt: zmień rozmiar formularza, dodaj etykietę i przycisk i zmień nazwę metody InitializeComponent() + przeprowadź ponowną kompilację. Formularz powraca do domyślnego rozmiaru!

Jeśli potrzebujesz wywołać kod przez załadowanie formularza, po prostu zastąp metodę wirtualną OnLoad(), jeśli potrzebujesz wywołać kod za pomocą formularza, proste zastąpienie metody wirtualnej OnShown().

Pamiętaj, aby zadzwonić do bazy.Method() na początku nadpisania.

Mam nadzieję, że moje małe doświadczenie może pomóc!

1

Pozostawienie designer.cs w spokoju nie tylko zapobiega nadpisywaniu zmian, ale także pomaga innym programistom, mówiąc, że nie powinno to być nic nieoczekiwanego. Biorąc to pod uwagę, istnieje co najmniej jeden wyjątek, jaki mogę wymyślić i jest to wspomniany autor postu: rozszerzenie metody Dispose(). Według mojej wiedzy ten kod - raz wygenerowany - nie zostanie nadpisany.

Jednak moim zdaniem znacznie lepszym rozwiązaniem jest zastąpienie metody Dispose, a następnie zadzwonić pod numer base.Dispose(), aby pozostawić clean designer.cs.

+1

Ale zauważ, że Dispose() nie jest częścią generowanego #regionu; jest generowany tylko raz, więc można go bezpiecznie przenieść. –

4

Myślę, że inne odpowiedzi upraszczają zbyt wiele.

Przede wszystkim, całkowicie zgadzam się, że jest to prawie zawsze zły pomysł na edycję pliku .designer, ale jest kilka przypadków, w których to zrobiłem, czuję, że to było dobre i właściwe, i nie zrobiłem tego. t się spalić.

  1. Załóżmy, że utworzyłem etykietę i przypadkowo kliknij dwukrotnie. Projektant tworzy metodę w moim głównym pliku .cs które następnie usunąć:

    private void label1_Click(object sender, EventArgs e) 
    { 
    
    } 
    

    Cóż, teraz kod nie będzie budować, chyba że również usunąć następujące elementy z mojego pliku .designer:

    this.label1.Click += new System.EventHandler(this.label1_Click); 
    
  2. Rzadziej, kolejność, w jakiej rzeczy są dodawane do formularza lub panelu (lub menu!), Ma znaczenie, a zmiana kolejności w kodzie może być łatwiejsza niż w interfejsie GUI projektanta. Z mojego doświadczenia wynika, że ​​VS 2010 zawsze podnosi na ten temat, aktualizuje informacje GUI i przerysowuje jego podgląd. Pamiętaj tylko, aby skupić się na metodach Add() - zmienne porządkowe są zadeklarowane w ogóle, nie ma znaczenia.

  3. Jeśli ustawisz właściwość, która spowoduje dodanie linii do pliku .designer, usunięcie linii zostanie szybko pobrane i Projektant odświeży. Być może rozsądniej/bezpieczniej jest użyć GUI do zmiany właściwości, ale myślę, że usunięcie linii jest czystsze.

  4. Kod, który nie znajduje się w tym regionie, #region Windows Form Designer generated code, zostanie wygenerowany tylko raz. Można go bezpiecznie przenosić, a jak polecili inni w innym miejscu (https://stackoverflow.com/a/6527072/1593924), przeniesienie metody Dispose(bool) w rzeczywistości może mieć wiele sensu, jeśli modyfikuje się ją lub dodaje metodę Dispose(), która powinna idealnie leżeć obok Dispose(bool).

    protected override void Dispose(bool disposing) 
    { 
        if (disposing && (components != null)) 
        { 
         components.Dispose(); 
        } 
        base.Dispose(disposing); 
    

ZASTRZEŻENIA:

  1. Powiedział, że próbował już tylko VS 2010 Ostateczny; Twój przebieg może się różnić 1-3 powyżej, ale 4 powinno być bezpieczne, o ile .designer jest klasą częściową z Dispose(bool) poza tym #region. Upewniam się także, że najnowsza dobra wersja pliku .designer została zatwierdzona w źródłowym repozytorium, zanim się z nim zepsuję.

  2. Przyznając, że pasują do wzoru Dispose(bool disposing), nie zamierzam promować takiego podejścia. Wydaje się, że w większości przypadków używa się goodreasons do simply, a tylko do more dla zasobów niezarządzanych, z których każdy jest enkapsulowany jeden do jednego w dedykowanym obiekcie jednorazowym.

Powiązane problemy