2009-03-13 3 views
8

Ich habe eine anständige Größe von Daten, die in einem aktiven Datensatz gespeichert werden müssen. Um die Formularfelder auf der Seite vorab auszufüllen, habe ich bereits den folgenden Code geschrieben:Gibt es eine Methode, um die linke und rechte Seite eines Satzes von Ausdrücken in Visual Studio zu tauschen?

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! 

Gibt es irgendeine Art des Verfahrens (integrierte Funktionalität, Makro, etc.), die ich zu tauschen nutzen könnte, um jede Seite des Ausdrucks so, dass die Daten im aktiven Datensatz gespeichert werden, anstatt von diesem gelesen zu werden, um eine Datenbank einfügen zu können? Zum Beispiel, nach dem obigen Code markieren und das Makro ausgeführt wird, wäre es worden:

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

Da die Anzahl der Spalten in der Datenbank, die diese aktive Datensatz ist ziemlich groß kapselt, so scheint es, wie die meisten diese Typisierung sein könnten vermieden mit einem einfachen automatisierten Prozess.

Offensichtlich würde dies 100% nicht funktionieren, weil manchmal müsste es Typkonvertierungen sein (z int zu string), aber zum größten Teil ich denke, das viel Zeit sparen würde.

Antwort

10

Hier ist ein Makro, das es tun:

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 

Grundsätzlich nimmt es den ausgewählten Text (entweder eine Zeile oder so viele Zeilen, wie Sie wählen) und verwendet einen regulären Ausdruck der Werte zu tauschen. Nicht schön, aber Makros sind es nie.

+0

Ordentlich! Gibt es eine Möglichkeit, es im gesamten Textblock im Gegensatz zu nur einer Zeile auszuführen? –

+0

Es funktioniert für so viele Textzeilen, wie Sie auswählen. –

+0

Odd, es funktioniert nur für die 1. Zeile, wenn ich mehrere auf einmal auswählen. Verwenden Sie VS2008? –

0

Nicht in der Lage, es mit der Regex zu arbeiten (muss eine Visual Studio 2010 Sache sein) Ich habe es auf die alte Art und Weise mit klassischen Splitting getan. Es enthält auch eine Überprüfung, um VB- und C# -Kommentarzeilen zu überspringen. Buchung für wen auch immer es könnte ..

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 
Verwandte Themen