2009-03-13 21 views
8

Tôi có một bộ dữ liệu có kích thước phù hợp cần được lưu trữ trong một bản ghi hoạt động. Để prepopulate các trường mẫu trên trang web, tôi đã viết đoạn mã sau:Có phương pháp nào để hoán đổi các mặt bên tay trái và bên phải của một tập các biểu thức trong Visual Studio không?

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ó một số loại của phương pháp (built-in chức năng, vĩ mô, vv) mà tôi có thể sử dụng để trao đổi mỗi bên của biểu thức sao cho dữ liệu được lưu vào bản ghi hoạt động như trái ngược với đọc từ nó để thực hiện chèn cơ sở dữ liệu? Ví dụ, sau khi làm nổi bật đoạn code trên và chạy macro, nó sẽ trở thành:

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

Kể từ khi số lượng cột trong cơ sở dữ liệu mà kỷ lục hoạt động này đóng gói là khá lớn, nó có vẻ như hầu hết gõ này có thể là tránh với một quá trình tự động đơn giản.

Rõ ràng điều này sẽ không hoạt động 100% vì đôi khi sẽ phải chuyển đổi loại (ví dụ: int thành string) nhưng đối với hầu hết các phần, tôi nghĩ điều này sẽ tiết kiệm được rất nhiều thời gian.

Trả lời

10

Dưới đây là một macro mà sẽ làm điều đó:

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 

Về cơ bản nó sẽ đưa văn bản đã chọn (hoặc một dòng hay nhiều dòng như bạn chọn) và sử dụng một biểu thức chính quy để trao đổi các giá trị. Không đẹp nhưng sau đó macro không bao giờ.

+0

Gọn gàng! Có cách nào để thực hiện nó trên toàn bộ khối văn bản thay vì chỉ một dòng không? –

+0

Nó sẽ hoạt động với nhiều dòng văn bản bạn chọn. –

+0

Rất tiếc, nó chỉ hoạt động đối với dòng đầu tiên khi tôi chọn một số cùng một lúc. Bạn đang sử dụng VS2008? –

0

Không thể làm cho nó hoạt động với Regex (phải là một điều hình ảnh năm 2010) Tôi đã làm nó theo cách thời trang cũ bằng cách chia tách cổ điển. Nó cũng bao gồm một kiểm tra để bỏ qua VB và C# dòng bình luận. Đăng nó cho bất kỳ ai có thể cần nó ..

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 
Các vấn đề liên quan