2009-03-13 5 views
8

Ho un set di dati di dimensioni decenti che deve essere memorizzato in un record attivo. Al fine di precompilare i campi del modulo sulla pagina, ho già scritto il seguente codice:Esiste un metodo per scambiare i lati sinistro e destro di un insieme di espressioni in Visual Studio?

Device device = new Device(DeviceID); // device is simply the active record 

txtDeviceName.Text = device.Name; 
txtNotes.Text = device.Notes; 
txtHostName.Text = device.Hostname; 
txtAssetTag.Text = device.AssetTag; 
txtSerialNumber.Text = device.SerialNumber; 
// snip... the list goes on! 

C'è una sorta di metodo (funzionalità built-in, macro, etc.) che potrei usare per scambiare ogni lato dell'espressione in modo tale che i dati vengano salvati nel record attivo anziché leggere da esso per eseguire un inserimento nel database? Ad esempio, dopo aver evidenziato il codice di cui sopra e l'esecuzione della macro, diventerebbe:

device.DeviceName = txtDeviceName.Text; 
device.Notes = txtNotes.Text; 
device.Hostname = txtHostName.Text; 
device.AssetTag = txtAssetTag.Text; 
device.SerialNumber = txtSerialNumber.Text; 
// snip again... 

Dal momento che il numero di colonne nel database che questo record attivo incapsula è piuttosto grande, sembra che la maggior parte di questa tipizzazione potrebbe essere evitato con un semplice processo automatizzato.

Ovviamente questo non avrebbe funzionato al 100%, perché a volte ci sarebbe dovuto essere conversioni di tipo (per esempio int a string), ma per la maggior parte credo che questo permetterebbe di risparmiare un sacco di tempo.

risposta

10

Ecco una macro che lo farà:

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports System.Diagnostics 
Imports System.Text.RegularExpressions 

Public Module Helpers 
    Sub SwapAssignment() 
     If (Not IsNothing(DTE.ActiveDocument)) Then 
      Dim selection As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection) 
      selection.Text = Regex.Replace(selection.Text, "([^\s]*)\s*=\s*([^\s]*);", "$2 = $1;") 
     End If 
    End Sub 
End Module 

Fondamentalmente si prende il testo selezionato (o una linea o le linee che si seleziona) e utilizza un'espressione regolare per scambiare i valori. Non bello ma i macro non lo sono mai.

+0

Neat! C'è un modo per eseguirlo sull'intero blocco di testo rispetto a una sola riga? –

+0

Funzionerà per il numero di righe di testo selezionato. –

+0

Dispari, funziona solo per la 1a riga quando ne seleziono diversi contemporaneamente. Stai usando VS2008? –

0

Impossibile farlo funzionare con Regex (deve essere una cosa di visualstudio 2010) Ive ha fatto il vecchio modo utilizzando la classica divisione. Include anche un controllo per saltare le righe di commento VB e C#. Inseriscilo per chiunque ne abbia bisogno ..

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports System.Diagnostics 
Imports System.Text.RegularExpressions 

Public Module Helpers 
    Sub SwapAssignment() 
     If (Not IsNothing(DTE.ActiveDocument)) Then 
      Dim selection As TextSelection = CType(DTE.ActiveDocument.Selection, TextSelection) 
      Dim lineArray() = selection.Text.Split(vbCrLf) 
      Dim output = "" 
      For Each line As String In lineArray 
       line = line.Trim() 

       If line.Length >= 1 Then 
        If line.Substring(0, 1).Equals("'") OrElse line.Substring(0, 1).Equals("/") Then 
         output &= line & vbCrLf 
         Continue For 
        End If 
       End If 

       If line.Contains(" = ") Then 
        Dim splittedline = line.Split("=") 
        output &= splittedline(1) + " = " + splittedline(0) & vbCrLf 
       Else 
        output &= line & vbCrLf 
       End If 
      Next 
      Dim check = output 
      selection.Text = output 
     End If 
    End Sub 
End Module 
Problemi correlati