2009-03-13 9 views
8

Mam porządny zestaw danych, które muszą być przechowywane w aktywnym rekordzie. Aby wstępnie wypełnić pola formularza na stronie, już napisane następujący kod:Czy istnieje metoda zamiany lewej i prawej strony zestawu wyrażeń w programie 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! 

Czy istnieje jakaś metoda (wbudowane funkcjonalności, makro, etc.), które mógłbym wykorzystać do wymiany po każdej stronie wyrażenia, że ​​dane są zapisywane w aktywnym rekordzie, a nie czytane z niego w celu wykonania wstawienia bazy danych? Na przykład, po podkreślając powyższy kod i uruchomieniu makra, to stać:

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

Ponieważ liczba kolumn w bazie danych, który to aktywny rekord kapsułkuje jest dość duża, wydaje się, że większość tego typowania może być uniknięto go za pomocą prostego zautomatyzowanego procesu.

Oczywiście nie działałoby to w 100%, ponieważ czasami trzeba byłoby dokonać konwersji typu (np.

Odpowiedz

10

Oto makro, które zrobi to:

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 

Zasadniczo zajmuje zaznaczonego tekstu (albo jeden wiersz lub wiele linii, jak select) i używa wyrażenia regularnego, aby zamienić wartości. Nie ładne, ale makra nigdy nie są.

+0

Schludny! Czy istnieje sposób, aby wykonać go na całym bloku tekstu, a nie tylko na jednej linii? –

+0

Będzie działać dla tylu linii tekstu, ile wybierzesz. –

+0

Nieparzysta, działa tylko dla pierwszej linii, gdy wybiorę kilka naraz. Czy używasz VS2008? –

0

Nie można go uruchomić z Regexem (musi to być visualwork 2010) Zrobiłem to staromodny sposób używając klasycznego podziału. Zawiera również opcję pomijania linii komentarzy VB i C#. Publikowanie go dla każdego, kto może go potrzebować.

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