2015-06-08 22 views
12

Sto lavorando a un progetto WinForms con alcuni compiti ripetitivi ogni giorno. Quindi ho pensato che lo creating code a snippet mi aiuterà, ma funziona solo con codice fisso.snippet di codice dinamico C# visual studio

Voglio creare dinamicamente uno snippet di codice, in base ai nomi dei controlli e ad alcune condizioni.

Desidero aggiungere il codice una volta completata la parte di progettazione. Definisco i nomi dei controlli come intTextboxAge. Lo snippet dovrebbe aggiungere la convalida automatica per tutte le caselle di testo, utilizzando la funzione definita di seguito.

Ci devono essere diversi controlli basati sul prefisso del nome del controllo (int, str, dou, dec). Ad esempio:

public void AutoCode() 
{ 
    int i=0; 
    foreach(On all controls) 
    { 
     if(controls is textbox or combobox) 
     { 
      if(control.text starts with int) 
      { 
       a[i] = Validation.ValidateInt(labelError, control.text, val => acdnt.date = val); 
      } 
     } 
    } 
} 

Voglio uno snippet di codice generato automaticamente, le librerie non saranno in grado di aiutarmi.

Il mio motivo non è quello di generare codice per la convalida, solo dall'esempio sopra è solo come possiamo farlo.

voglio generare automaticamente il mio tutto il codice della logica di business per la sagoma vittoria come

  1. convalida
  2. Creazione nuova classe per le variabili
  3. Datafilling in classe dopo la convalida
  4. creazione automatica di funzione di database inserire e aggiornare

Perché in tutte le attività sopra elencate solo modifiche al nome della variabile r il compito aziendale est rimane lo stesso. Come possiamo implementare

Creazione automatica di classe- La classe verrà creata con il nome del modulo + "Classe" e i tipi di variabile verranno identificati dai primi 3 caratteri e avranno lo stesso nome del controllo.

Creazione automatica dell'inserimento e dell'aggiornamento della funzione del database - Il nome della tabella del database nome sarà uguale al nome del modulo e al nome della colonna stesso del nome del controllo, in modo che possa creare dinamicamente anche query di inserimento e aggiornamento.

Perché non voglio con la libreria di classi perché in tal caso esegue tutte le operazioni in fase di esecuzione che andranno a mangiare le mie prestazioni da qualche parte.

Con questo possiamo risparmiare un sacco di tempo e gli sforzi del mondo della codifica.

+0

Un esempio specifico potrebbe aiutarci a fornire un suggerimento. Intendi prima che venga inserito lo snippet di codice, richiesto per i valori dinamici? –

+0

Forse potresti guardare strumenti come CodeRush o Resharper. Sono dotati di sofisticati motori di template, potrebbero funzionare (non sono associato a nessuno di questi strumenti) – Sascha

+3

Invece di elaborare uno snippet di codice, perché non creare una libreria di metodi appropriati? Sarebbe molto meglio avere questo codice * una volta * e quindi chiamarlo da più posti che avere l'intero codice in più posti. –

risposta

8

Desidero aggiungere il codice una volta eseguita la parte di progettazione. Definisco i nomi dei controlli come intTextboxAge. Lo snippet dovrebbe aggiungere la convalida automatica per tutte le caselle di testo, utilizzando la funzione definita di seguito.

Sarebbe meglio avere CustomControls con la loro convalida, in questo modo non è necessario aggiungere il codice dopo che la parte di progettazione è fatto:

enter image description here

//Integer input CustomControl with validation label (pictured above) 
public partial class intTextBox : UserControl 
{ 
    public bool IsValid {get;set;} 
    public intTextBox() 
    { 
     InitializeComponent(); 
     this.textBox1.TextChanged += this.intTextBox_TextChanged; 
    } 

    private void intTextBox_TextChanged(object sender, EventArgs e) 
    { 
     int n; 
     IsValid = int.TryParse(this.textBox1.Text, out n); 
     label1.Visible = !IsValid; 
    } 
} 

Ci devono essere diversi controlli basati sul prefisso del nome del controllo (int, str, dou, dec)

Sebbene sia possibile utilizzare prefisso del nome di controllo del raccomanda di creare i propri controlli utente derivando off controlli di base e semplicemente testare il tipo di controllo:

//Decimal input UserControl 
public class decTextBox : TextBox 
{ 
    public string Text 
    { 
     get { 
      return this.Text; 
     } 
    } 

    public bool IsValid() 
    { 
     decimal n; 
     bool isDecimal = decimal.TryParse(this.Text, out n); 
     return isDecimal; 
    } 
} 

....

public Control AutoCode(Control forEgTheForm) 
{ 
    //Tip: You may need to recursively call this function to check children controls are valid 
    foreach(var ctrl in forEgTheForm.Controls) { 
     if(ctrl is TextBoxBase) { 
      if(ctrl is decTextBox) { 
       decTextBox txt = ((decTextBox)ctrl); 
       //If its not a valid value then set a[i]=true/false or in this example return the control... 
       if (!txt.IsValid()) return ctrl; 
      } 
     } 
    } 
} 

Voglio creare dinamicamente uno snippet di codice, in base ai nomi dei controlli e ad alcune condizioni.

Se avete intenzione di creare frammenti di codice lo fanno in base ai tipi di controllo, non controllano prefisso del nome di così non avete bisogno loro di essere dinamici.

...


Sarebbe ancora più elegante di non dover scrivere alcun Snippets o codice di validazione. Questa è la soluzione ideale. Raccomando di farlo usando il giusto tipo di controlli.

Le caselle di testo sono utili per la stringa, tuttavia per int's, dec e dbl è preferibile utilizzare il controllo NumericUpDown. In questo modo gli utenti intuitivamente sapranno di dover inserire numeri (e non saranno in grado di inserire caratteri alfanumerici). Dopo aver impostato un paio di proprietà di controllo NumericUpDown (sia in fase di progettazione o in fase di esecuzione) non avrete bisogno di codificare in validazione:

enter image description here


Non sono sicuro circa la causa del degrado delle prestazioni si stai incontrando? Anche se ti suggerisco di associare i controlli a una classe in una libreria di classi con tutte le logiche di business in modo che tu possa Unit Test. Per la validazione del front-end, anche se la semplice validazione degli input è corretta, come mostrato sopra è la strada da percorrere.

+0

Felice di parlare di questa risposta. So che non è quello che chiedi * frammenti dinamici * ma era troppo lungo per un commento e propone di non dover scrivere snippet ... Cheers –

+0

Per favore controlla la mia modifica –

+0

Ho controllato il tuo aggiornamento e penso che questo QA stia girando in una domanda di camaleonte. ** Cosa ne pensi del mio consiglio per un approccio OOP, SECCO, SOLIDO? ** –

1

Puoi provare i generatori di codice basati su script come CodeSmith (c'è anche qualcosa di gratuito).
È possibile scrivere lo script in base alle variabili definite (anche in base agli elementi del database), quindi generare il codice.
Generare codice è un buon approccio perché consente di risparmiare tempo ma anche di standardizzare il codice.

1

Penso che sia possibile utilizzare lo spazio dei nomi System.Reflection combinato con lo spazio dei nomi System.CodeDom per ottenere ciò che si desidera.

È possibile utilizzare le classi nello spazio dei nomi System.Reflection e nella classe System.Type per scoprire il nome dell'assembly, lo spazio dei nomi, le proprietà, i metodi, la classe base e molti altri metadati relativi a una classe o variabile. Utilizzerai quindi questi metadati acquisiti dalle tue classi iniziali/di origine (ad es. Le tue Classi di form) per generare codice delle tue classi di destinazione (la tua azienda e le tue classi di dati) utilizzando CodeDOM.

Controllare questo collegamento msdn su How to: Create a Class using CodeDOM come punto di partenza.

Problemi correlati