2010-01-18 14 views
8

Ho un modulo, che ospita un controllo di tabulazione. ognuna di queste schede ha un sacco di controlli che vanno da casella di testo, combobox, treecontrol, controlli di rotazione.modifiche alla traccia in winform C#

Nella parte superiore del modulo è presente una casella di testo.

se sono state apportate modifiche utilizzando i controlli dei moduli, si dice che un valore viene modificato nella casella combinata della scheda 1 o un elemento è stato eliminato dal controllo struttura ho bisogno di mostrare un "*" che indica che alcuni valori sono stati cambiato.

Come posso ottenerlo in modo efficiente? o sta gestendo il resp. controlla l'evento modificato l'unico modo per sapere se un elemento è cambiato o no?

+0

Potrebbe aiutare a conoscere un po 'di più su come si utilizzano le informazioni che v'è stato un cambiamento di "stato" su un dato TabPage: se c'è stato un cambiamento di impostazione di controllo/proprietà, fai qualcosa prima che l'utente possa passare a un altro TabPage? Come serializzare i controlli, salvando i dati delle proprietà in qualche modo? Il link La risposta di TommieB ti dà un articolo di CodeProject molto buono, perché l'articolo illustra tre diverse strategie per monitorare il cambiamento di stato. – BillW

risposta

4

Penso che questo articolo su Codeproject potrebbe aiutarti, aiuta a tracciare le modifiche nei controlli winforms.

Spero che questo aiuti.

+0

Bel articolo !!!!! – gbianchi

1

Dipende interamente dall'architettura sottostante del software. Se è stato scritto in modo ingenuo, allora sì, una qualche forma di forza bruta è solo l'unico modo in cui puoi andare (e questo, ovviamente, renderà il codice molto più grave - ecco perché una buona architettura è importante).

Se, d'altra parte, il software è stato ragionevolmente ben progettato, allora avrete degli oggetti dietro l'interfaccia utente che tracciano lo stato dell'interfaccia utente. Questi oggetti possono implementare qualcosa come INotifyPropertyChanged e puoi sfruttarlo con un meccanismo di mappatura per aggiornare l'interfaccia utente per i campi modificati.

Sospetto che tu cada nella prima situazione, tuttavia, in cui qualsiasi buona risposta al tuo problema è stata eliminata molto prima di quello che stai cercando di fare ora. Sto inferendo questo dalla tua affermazione che il modulo "ospita un tabcontrol" e che "ognuna di queste schede ha [sic] un sacco di controlli ..." Questo è un antipattern UI che ho visto più e più volte dai poveri progettisti.

+0

Perché descrivi il controllo struttura a schede che contiene un numero di altri controlli come antipattern? Dal punto di vista del design, come lo rifatteresti? –

+1

@Neil: UserControl (s). Ho visto tonnellate di software terribile che schiaffeggia (letteralmente) dozzine di controlli direttamente sulle schede, fondamentalmente rendendo 'Form1' (è quasi inevitabilmente chiamato' Form1') un unico contenitore globale per tutti gli stati senza alcun senso di astrazione. I membri di Form1 vengono utilizzati come stato globale (anche con prefisso freq. 'Glb'). Posso pensare a uno specifico software che la mia azienda vende per> $ 10k/licenza che ha abusato delle classi parziali per diffondere Form1 su 11 file con controlli come 'textBox74'. Sì, ci sono più di 74 caselle di testo. –

+1

Quello con cui ho lavorato si chiamava 'frmMain'. Hanno lasciato 'Form1' nel progetto, e l'unico scopo di' Form1' era di mostrare 'frmMain' e poi chiudersi. –

1

È possibile provare qualcosa seguendo queste linee, è necessario aggiungere un po 'per ogni tipo di controllo sul modulo. All'evento di caricamento di from fai un addUpdateNotification (this);

public void addUpdateNotification(Control start) 
    { 
     foreach (Control c in start.Controls) 
     { 
      if (c is TextBox) 
      { 
       var text = c as TextBox; 
       text.TextChanged += notifyChanged; 
      } 

      addUpdateNotification(c); 
     } 
    } 

    public void notifyChanged(Object sender, EventArgs args) 
    { 
     UpdateTextBox.Text = "*"; 
    } 
+1

@BillW sei sicuro? Sta passando attraverso tutti i bambini di ogni controllo a partire dal controllo di partenza. La ricorsione infinita avverrebbe solo se un bambino controlla uno dei suoi genitori da bambino e il codice di quell'articolo sembra che si soffocherebbe nella stessa situazione (che non sono nemmeno sicuro se tale situazione sia possibile). – BarrettJ

+0

@ Tester101 corretto, avrebbe dovuto essere utilizzato nella riga successiva anziché c.TextChanged – BarrettJ

+0

@BarretJ Le mie scuse, il tuo codice non produce la ricorsione: ho violato la mia politica di non commentare il codice che non avevo testato personalmente: che insegnerà me ! – BillW