컨트롤을 폼에 배치할 때, 일반적으로 Visual Studio의 폼디자이너를 사용해서 구현합니다.

그러나, 실행시에, 동적으로 컨트롤을 작성해 폼에 배치할 경우도 있겠죠.

여기에서는 Button 컨트롤을 폼에 배치하여, 실행시에 작성하는 방법에 대해서 설명합니다.

 

[컨트롤을 작성하여, 폼에 표시한다]

"Button1"이라고 하는 Button 컨트롤을 작성하고, 폼에 표시하려면 다음과 같이 하면 됩니다.

 

Private Button1 As System.Windows.Forms.Button

'폼의 실행시 이벤트 핸들러
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load
    'Button클래스의 인스턴스를 생성한다.
    Me.Button1 = New System.Windows.Forms.Button()

    'Button컨트롤의 프로퍼티를 설정한다.
    Me.Button1.Name = "Button1"
    Me.Button1.Text = "눌러보세요."
    '사이즈와 위치를 설정한다.
    Me.Button1.Location = New Point(10, 10)
    Me.Button1.Size = New System.Drawing.Size(80, 20)

    '폼에 추가한다.
    Me.Controls.Add(Me.Button1)
End Sub

 

Button 클래스의 인스턴스를 작성해서, 필요한 프롭퍼티를 설정하고, 폼의 Controls 프롭퍼티의 Add 메소드를 사용해 폼에 배치하고 있습니다.

 

 

[퍼포먼스를 향상시키는 방법]

컨트롤을 폼에 배치할 때, 그 전에 SuspendLayout 메소드를 호출해 레이아웃 논리를 일시정지시키는 것으로 퍼포먼스가 향상됩니다.

특히 많은 컨트롤을 폼에 배치할 때는, SuspendLayout 메소드를 사용하는 편이 좋을 것입니다.
SuspendLayout 메소드를 사용하는 예는 아래를 참고해주세요.

 

Private Button1 As System.Windows.Forms.Button

'폼로드 이벤트 핸들러
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load
    'Button클래스의 인스턴스를 작성한다.
    Me.Button1 = New System.Windows.Forms.Button()

    '폼의 레이아웃 로직을 중단시킨다.
    Me.SuspendLayout()

    'Button컨트롤의 프로퍼티를 설정한다.
    Me.Button1.Name = "Button1"
    Me.Button1.Text = "눌러보세요."
    '사이즈와 위치를 설정한다.
    Me.Button1.Location = New Point(10, 10)
    Me.Button1.Size = New System.Drawing.Size(80, 20)

    '폼에 추가한다.
    Me.Controls.Add(Me.Button1)

    '폼의 레이아웃 로직을 개시한다.
    Me.ResumeLayout(False)
End Sub

DataGrid 클래스의 HitTest 메소드에 의해, 지정된 좌표 위치의 정보(셀, 헤더, 경계선, 배경 등)를 취득할 수 있습니다.


다음의 예에서는 DataGrid1(DataGrid 오브젝트) 에서 마우스가 클릭되었을때, 이벤트를 제어하여, 위치정보를 표시하고 있습니다.

 

'마우스 클릭이벤트
Private Sub DataGrid1_MouseDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles DataGrid1.MouseDown
    Dim grid As DataGrid = CType(sender, DataGrid)

'클릭된 지점의 좌표정보를 취득한다.
    Dim hti As System.Windows.Forms.DataGrid.HitTestInfo
    hti = grid.HitTest(e.X, e.Y)   

'클릭된 장소정보를 취득

    Select Case hti.Type
        Case System.Windows.Forms.DataGrid.HitTestType.None
            Console.WriteLine("배경이 클릭되었습니다.")
        Case System.Windows.Forms.DataGrid.HitTestType.Cell
            Console.WriteLine("행{0}열{1}의 셀이 클릭되었습니다.", _
                hti.Row, hti.Column)
        Case System.Windows.Forms.DataGrid.HitTestType.ColumnHeader
            Console.WriteLine("열헤더'{0}'이 클릭되었습니다.", _
                hti.Column)
        Case System.Windows.Forms.DataGrid.HitTestType.RowHeader
            Console.WriteLine("행헤더'{0}'이 클릭되었습니다.", hti.Row)
        Case System.Windows.Forms.DataGrid.HitTestType.ColumnResize
            Console.WriteLine("열'{0}'의 경계선이 클릭되었습니다.", _
                hti.Column)
        Case System.Windows.Forms.DataGrid.HitTestType.RowResize
            Console.WriteLine("행'{0}'의 경계선이 클릭되었습니다.", hti.Row)
        Case System.Windows.Forms.DataGrid.HitTestType.Caption
            Console.WriteLine("캡션이 클릭되었습니다.")
        Case System.Windows.Forms.DataGrid.HitTestType.ParentRows
            Console.WriteLine("부모행이 클릭되었습니다.")   

     End Select

End Sub

 

현재의 마우스 포인터 위치로부터 DataGrid의 정보를 취득하는 방법은 아래를 참고하세요.

 

'마우스 포인터의 화면 좌표를 클라이언트 좌표에 변환
Dim p As Point = DataGrid1.PointToClient(Cursor.Position)

'좌표 위치의 정보를 취득
Dim hti As System.Windows.Forms.DataGrid.HitTestInfohti = DataGrid1.HitTest(p)
'결과를 표시

Console.WriteLine(hti.ToString())

DataGridColumnStyle.Paint 메소드를 오버라이드하여 DataGridColumnStyle로부터의 상속 클래스를 작성하는 것으로써 셀에 이미지를 표시할 수 있게 됩니다.


우선 다음과 같은 클래스를 작성하여, Paint 메소드에서 이미지를 작성할수 있도록 합니다.

아래의 예에서는 DataGridTextBoxColumn의 상속 클래스 DataGridImageTextBoxColumn 클래스를 작성해, 셀의 값이 이미지 파일명이라고 하여 이미지를 작성하도록 합니다.

 

'셀에 이미지를 표시하기위한 클래스

'셀의값(문자열)을 파일명이라하여 이미지를 표시한다.
'DataGridTextBoxColumn를 계승하는 클래스를 작성

Public Class DataGridImageTextBoxColumn
    Inherits DataGridTextBoxColumn

    'Paint메소드를 오버라이드한다.
    Protected Overloads Overrides Sub Paint( _
            ByVal g As Graphics, _
            ByVal bounds As Rectangle, _
            ByVal source As CurrencyManager, _
            ByVal rowNum As Integer, _
            ByVal backBrush As Brush, _
            ByVal foreBrush As Brush, _
            ByVal alignToRight As Boolean _
            )

     '셀의값을 취득한다.
     Dim cellValue As Object = _
            Me.GetColumnValueAtRow(source, rowNum)
        If (Not cellValue Is Nothing) Then

            '표시된 파일명을 취득

            Dim fileName As String
            fileName = CType(cellValue, String)
            Try

                '이미지를 읽어온다.
                Dim bmp As New Bitmap(fileName)

                'bounds의 크기로 이미지를 표시한다.

                '(셀의 크기에 맞춰서 화면이 표시된다.)
                g.DrawImage(bmp, bounds)
            Catch ex As Exception

                '이미지를 불러오지 못한경우는 평상시대로 표시한다.
                MyBase.Paint(g, bounds, source, rowNum, _
                    backBrush, foreBrush, alignToRight)
            End Try
        End If
    End Sub

 

    '편집이 불가능하도록 Edit메소드를 오버라이드 한다.
    Protected Overloads Overrides Sub Edit( _
        ByVal source As CurrencyManager, _
        ByVal rowNum As Integer, _
        ByVal bounds As Rectangle, _
        ByVal [readOnly] As Boolean, _
        ByVal instantText As String, _
        ByVal cellIsVisible As Boolean)
    End Sub
End Class

 

다음에 이미지를 표시하고 싶은 열에 이 열의 스타일을 사용하도록 합니다.

아래의 예 에서는 데이터 소스가"Column1"이라는 이름의 DataColumn이 있는"DataTable1"라는 이름의 DataTable인 것을 전제로 하고 있습니다.

 

'새로운DataGridTableStyle 작성
Dim ts As New DataGridTableStyle()

'매핑이름을 지정

ts.MappingName = "DataTable1"

'행의 높이를 설정
ts.PreferredRowHeight = 200

'열의 스타일로는 DataGridImageTextBoxColumn를 사용한다.
Dim cs As DataGridImageTextBoxColumn
cs = New DataGridImageTextBoxColumn()

'매핑이름을 지정한다.
cs.MappingName = "Column1"

'간격을 지정한다.
cs.Width = 200

'DataGridTableStyle을 추가한다.
ts.GridColumnStyles.Add(cs)

'테이블스타일을 데이터그리드에 추가한다.
DataGrid1.TableStyles.Add(ts)

 

 

여기에서는 System.Windows.Forms.DataGrid 컨트롤을 수직 방향으로 스크롤 했을 때에, 다른 DataGrid도 동시에 스크롤 되는 방법을 소개합니다.


우선 DataGrid 컨트롤이 수직 방향으로 스크롤 된 것을 알려면 , Scroll 이벤트를 포착하거나 프로텍트 멤버의 GridVScrolled 메소드를 오버라이드(override) 하거나 같이 프로텍트 멤버의 VertScrollBar 프롭퍼티의 Scroll 이벤트를 포착하는 방법이 있습니다.


GridVScrolled 메소드나 VertScrollBar 프롭퍼티의 Scroll 이벤트를 포착하는 경우는, 주의가 필요합니다. 이것들은, 마우스의 휠을 사용한 스크롤이나, 커서 키에 의한 스크롤에는 반응하지 않습니다. 따라서, 이것들에 의한 스크롤에도 대응하기 위해서는, MouseWheel 이벤트등의 다른 방법도 병용 할 필요가 있습니다.


이하에 동시 스크롤을 가능하게 하는 DataGrid의 예를 나타냅니다.

 

''' <summary>
''' 동시 스크롤을 가능하게 하는 DataGrid
''' </summary>

Public Class MyDataGrid
    Inherits DataGrid

    Public Sub New()
        MyBase.New()
        AddHandler Me.Scroll, AddressOf MyDataGrid_Scroll
    End Sub

    Private _syncScrollGrid As MyDataGrid = Nothing

    ''' <summary>
    ''' 동시에 스크롤 시키는 DataGrid
    ''' </summary>

    Public Property SyncScrollGrid() As MyDataGrid
        Get
            Return _syncScrollGrid
        End Get
        Set(ByVal Value As MyDataGrid)
            If Not _syncScrollGrid Is Me Then
                _syncScrollGrid = Value
            Else
                Throw New ApplicationException("설정에 실패했습니다.")
            End If
        End Set
    End Property

    ''' <summary>
    ''' 지정한 위치까지 스크롤한다.
    ''' </summary>

    ''' <param name="rowNum">이 위치까지 스크롤한다.</param>
    Public Sub SetTopRow(ByVal rowNum As Integer)
        Dim args As New ScrollEventArgs(ScrollEventType.LargeIncrement, rowNum)
        MyBase.GridVScrolled(Me, args)
    End Sub

    Private Sub MyDataGrid_Scroll(ByVal sender As Object, ByVal e As EventArgs)
        If Not (_syncScrollGrid Is Nothing) Then

            '지정위치까지 스크롤한다.

            _syncScrollGrid.SetTopRow(VertScrollBar.Value)
        End If

        '포커스가 다른 컨트롤로 이동되지 않도록 한다.

        Me.Focus()
    End Sub
End Class

 

이 클래스를 사용하려면, DataGrid 컨트롤을 이 MyDataGrid에 옮겨놓습니다.

유저가 스크롤 하는 DataGrid의 스크롤과 동시에 스크롤 시키고 싶은 DataGrid의 양쪽 모두에 MyDataGrid를 사용합니다. 그리고 유저가 스크롤 하는 MyDataGrid의 SyncScrollGrid 프롭퍼티에, 동시에 스크롤 시키고 싶은 MyDataGrid를 지정합니다. 또한 양자의 MyDataGrid의 행수는 반드시 같게 해 주세요.

무조건 유저가 모든 행을 삭제할 수 없게 하는 방법

일반적으로 DataGridView내의 행을 DELETE 키로 삭제할 수 있습니다만, DataGridView 컨트롤의 AllowUserToDeleteRows 프롭퍼티를 False와 하는 것으로써, 유저가 행을 삭제할 수 없게 됩니다.

 

'DataGridView1의 행을 유저가 삭제할 수 없게 하는 방법

DataGridView1.AllowUserToDeleteRows = False

 

다만 이와 같이 해도, DataGridViewRowCollection.Remove 메소드등에서 행을 삭제할 수 있습니다.

 

 

 


조건에 따라 유저가 행을 삭제할 수 없게 하는 방법


유저가 행을 삭제하려고 했을 때, DataGridView.UserDeletingRow 이벤트가 발생합니다.

여기서 삭제해도 상관없는가 판단하고, 조건에 의해 삭제처리를 취소할 수 있습니다.
행을 삭제하기 전에 유저에게 확인하는 예는 아래를 참조해주세요.

 

'DataGridView1의 UserDeletingRow 이벤트 핸들러
Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, _
        ByVal e As DataGridViewRowCancelEventArgs) _
        Handles DataGridView1.UserDeletingRow

    '삭제할지 유저에게 확인한다.
    If MessageBox.Show("이 행을 삭제하시겠습니까?", "삭제확인", _
        MessageBoxButtons.OKCancel, MessageBoxIcon.Question) <> _
            Windows.Forms.DialogResult.OK Then
        e.Cancel = True
    End If
End Sub

DataGridView의 ShowCellToolTips 프롭퍼티가 True이면, 셀에 ToolTip이 표시됩니다. ShowCellToolTips 프롭퍼티는 디폴트값이 True로써 셀의 폭이 너무 좁아서 텍스트가 표시 다 할 수 없을 때에, 그 텍스트의 내용이 ToolTip으로서 표시됩니다.

 

 


ToolTipText 프롭퍼티를 사용한다.


 

셀에 표시하는 ToolTip의 내용을 지정하려면 셀(DataGridViewCell)의 ToolTipText 프롭퍼티를 사용하면 됩니다.
헤더 셀에 표시하는 ToolTip도 헤더 셀을 취득하고, 보통 셀과 같이 ToolTipText 프롭퍼티로 설정할 수 있습니다. 단지, 열헤더에 표시하는 ToolTip은, DataGridViewColumn.ToolTipText 프롭퍼티에서도 설정할 수 있습니다.

 

'셀에 표시하는ToolTip을 설정한다.
DataGridView1(0, 0).ToolTipText = "이 셀은 변경할수 없습니다."

'열헤더에 표시하는ToolTip을 설정한다.
DataGridView1.Columns(0).ToolTipText = "이 행에는 숫자를 입력할수 있습니다."

'행헤더에 표시하는 ToolTip을 설정한다.
DataGridView1.Rows(0).HeaderCell.ToolTipText = "이 행의 셀은 변경할수 없습니다."

 

 


CellToolTipTextNeeded 이벤트를 사용한다. 


 

다수의 셀에 ToolTip을 설정하는 경우는, 하나 하나의 셀의 ToolTipText 프롭퍼티를 설정하는 방법은, 효율적이라고는 할 수 없습니다. 이러한 경우는, CellToolTipTextNeeded 이벤트를 사용하면 좋을 것입니다.
셀의 현재 상태에 의해서 ToolTip에 표시시키는 문자열을 변경시키고 싶은 경우에도, CellToolTipTextNeeded는 도움이 됩니다.
다만 이 이벤트는, DataSource 프롭퍼티가 설정되어 있는지, VirtualMode 프롭퍼티가 True일 때 밖에 발생하지 않습니다.
이하의 예에서는, 단순하게 셀의 위치를 ToolTip으로 표시하고 있습니다.

 

'CellToolTipTextNeeded 이벤트 핸들러
Private Sub DataGridView1_CellToolTipTextNeeded(ByVal sender As Object, _
        ByVal e As DataGridViewCellToolTipTextNeededEventArgs) _
        Handles DataGridView1.CellToolTipTextNeeded
    e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString()
End Sub

 

이 방법에서는 헤더에도 ToolTip이 표시됩니다. 헤더의 경우는, 행 헤더이면 [e.ColumnIndex]가

-1에, 열헤더이면 [e.RowIndex]가 -1이 됩니다.

MSDN의 [DataGridView.ProcessDataGridViewKey Method] 에, DataGridView로 Enter 키를 눌렀을 때에, 오른쪽 커서 키를 눌렀을 때와 같은 동작을 실시하도록(듯이) 하는 코드가 소개되고 있습니다. 여기서 소개되고 있는 방법은, DataGridView 클래스의 상속 클래스를 작성하여, ProcessDialogKey와 ProcessDataGridViewKey 메소드를 오버라이드(override) 하고, Enter 키가 밀렸을 때에 ProcessRightKey 메소드를 호출하는 방법입니다.

이 MSDN의 샘플을 참고해 작성한, Enter 키를 누르는 것으로, Tab 키를 눌렀을 때와 같이, 근처의 셀에 포커스가 이동하는 DataGridView의 상속 클래스를 이하에 나타냅니다.

 

Imports System
Imports System.Windows.Forms

''' <summary>

''' Enter키를 눌렀을때, Tab키가 눌러진것과 같은 동작을 시킨다.

''' 현재의 셀의 옆으로 포커스를 이동시킨다.

''' </summary>
Public Class DataGridViewEx
    Inherits DataGridView

    <System.Security.Permissions.UIPermission( _
        System.Security.Permissions.SecurityAction.LinkDemand, _
        Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
    Protected Overrides Function ProcessDialogKey( _
            ByVal keyData As Keys) As Boolean

        'Enter키가 눌러졌을때, Tab키가 눌러진것처럼 꾸민다.

        If (keyData And Keys.KeyCode) = Keys.Enter Then
            Return Me.ProcessTabKey(keyData)
        End If
        Return MyBase.ProcessDialogKey(keyData)
    End Function

    <System.Security.Permissions.SecurityPermission( _
        System.Security.Permissions.SecurityAction.LinkDemand, _
        Flags:=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
    Protected Overrides Function ProcessDataGridViewKey( _
            ByVal e As KeyEventArgs) As Boolean

        'Enter키가 눌러졌을때, Tab키가 눌러진것처럼 꾸민다.

        If e.KeyCode = Keys.Enter Then
            Return Me.ProcessTabKey(e.KeyCode)
        End If
        Return MyBase.ProcessDataGridViewKey(e)
    End Function
End Class
 

 

이것과는 별도의 방법으로 [DataGridView: Make Enter Key Move to Next Column] 에서 소개되고 있다.

셀의 값이 null이나 DBNull.Value때에, 셀에 [지정되어 있지 않습니다.] 라고 표시되도록 하려면 ,

다음과 같이 하면 됩니다.

 

DataGridView1.DefaultCellStyle.NullValue = "[지정되어 있지 않습니다.]"

 

NullValue 프롭퍼티에는 문자열 이외의 오브젝트도 설정할 수 있습니다.

예를 들면, 이미지를 표시하는 셀이라면, 이미지를 설정할 수 있습니다.

 

 

nul값의 입력

유저가 NullValue 프롭퍼티로 지정된 문자열을 셀에 입력했을 경우, 그 셀에는 null값이 입력됩니다.

유저가 셀에 null값을 입력했을 때에, 데이터 소스의 값이 무엇이 될까는, 셀 스타일의 DataSourceNullValue 프롭퍼티로 결정됩니다. 디폴트에서는 DataSourceNullValue 프롭퍼티는 DBNull.Value이므로, 상기의 예로 유저가 셀에 [지정되어 있지 않습니다. ] 라고 입력하면, 그 셀의 값은 DBNull.Value(셀의 형태가 참조형 때는, null)가 됩니다.
DataSourceNullValue 프롭퍼티를 변경하는 예를 나타냅니다.

NullValue를 [-], DataSourceNullValue를 [A]로 하고 있습니다.

이와 같이 한 상태로 유저가 셀에 [-]을 입력하면, 그 셀이 확정된 후, [A]로 바뀝니다.

 

DataGridView1.DefaultCellStyle.NullValue = "-"
DataGridView1.DefaultCellStyle.DataSourceNullValue = "A"

 

 

NullValue나 DataSourceNullValue 프롭퍼티가 변경되었는지 조사

NullValue나 DataSourceNullValue 프롭퍼티가 변경되었는지를 조사하려면 , IsNullValueDefault와 IsDataSourceNullValueDefault 프롭퍼티를 사용합니다. 변경사항이 존재하면, false가 됩니다.

NullValue나 DataSourceNullValue 프롭퍼티의 값이 디폴트와 같아도, 그것이 설정된 것이면 false가 됩니다.

폴더나 파일이 변경되자 마자 그것을 알기 위한 방법을 소개합니다.

이것은, System.IO.FileSystemWatcher 클래스를 사용하면 간단하게 할 수 있습니다.

폴더 또는 파일이 작성되었을 때에는 Created 이벤트가..

삭제되었을 때에는 Deleted 이벤트가..

이름이 변경되었을 때에는 Renamed 이벤트가...

사이즈, 시스템 속성, 최종 기입 시각, 최종 액세스 시각, 또는 시큐러티 액세스 허가가 변경되었을 때에는 Changed 이벤트가 발생합니다.

다음의 예에서는, 폴더"C:\My Documents"내의 TXT 파일의 작성, 삭제, 이름의 변경을 감시하고 있습니다. WaitForChanged 메소드를 사용해 동기적으로 감시하고 있기 때문에, 감시중일때는 멈춘것처럼 됩니다.

 

Dim watcher As New System.IO.FileSystemWatcher

'감시하는 디렉토리를 지정

watcher.Path = "C:\My Documents"

'*.txt파일을 감시, 모두 감시할 때는""으로 한다.

watcher.Filter = "*.txt"

'파일명과 디렉토리명으로 최종적으로 쓴날짜의 변경을 감시
watcher.NotifyFilter = System.IO.NotifyFilters.FileName Or _
    System.IO.NotifyFilters.DirectoryName Or _
    System.IO.NotifyFilters.LastWrite

'서브디렉토리는 감시하지않는다.
watcher.IncludeSubdirectories = False

'필요에따라서 버퍼의 사이즈를 변경한다.

'watcher.InternalBufferSize = 4096

'동기적인 감시를 실시한다.
Dim changedResult As System.IO.WaitForChangedResult = _
watcher.WaitForChanged(System.IO.WatcherChangeTypes.All)

If changedResult.TimedOut Then
    Console.WriteLine("타임아웃 되었습니다.")
Return
End If

 

'변경이 있었을때 결과를 표시한다.
Select Case changedResult.ChangeType
    Case System.IO.WatcherChangeTypes.Changed
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 변경되었습니다."))
    Case System.IO.WatcherChangeTypes.Created
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 작성되었습니다."))
    Case System.IO.WatcherChangeTypes.Deleted
        Console.WriteLine(("파일 [" + _
            changedResult.Name + "] 가 삭제되었습니다."))
    Case System.IO.WatcherChangeTypes.Renamed
        Console.WriteLine(("파일 [" + _
            changedResult.OldName + "] 의 이름이 [" + _
            changedResult.Name + "] 로 변경되었습니다."))
End Select

 

 

 


비동기적으로 감시하는 방법  


다음에 비동기적으로 감시하는 예를 소개합니다.

Button1을 클릭하는 것으로써 감시를 시작하여, Button2을 클릭하는 것으로써 감시를 종료합니다.

 

Private watcher As System.IO.FileSystemWatcher = Nothing

'Button1의 Click 이벤트 핸들러
Private Sub Button1_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    If Not (watcher Is Nothing) Then
        Return
    End If

    watcher = New System.IO.FileSystemWatcher

    '감시하는 디렉토리를 지정
    watcher.Path = "C:\My Documents"

    '최종액세스일시, 최종변경일시, 파일, 폴더이름의 변경을 감시한다.
    watcher.NotifyFilter = System.IO.NotifyFilters.LastAccess Or _
        System.IO.NotifyFilters.LastWrite Or _
        System.IO.NotifyFilters.FileName Or _
       System.IO.NotifyFilters.DirectoryName

   '모든 파일을 감시
    watcher.Filter = ""

    'UI의 스레드를 머셜링한다.

    '콘솔어플리케이션의 사용에서는 불필요
    watcher.SynchronizingObject = Me

    '이벤트 핸들러를 추가한다.
    AddHandler watcher.Changed, AddressOf watcher_Changed
    AddHandler watcher.Created, AddressOf watcher_Changed
    AddHandler watcher.Deleted, AddressOf watcher_Changed
    AddHandler watcher.Renamed, AddressOf watcher_Renamed

    '감시를 시작한다.
    watcher.EnableRaisingEvents = True
    Console.WriteLine("감시를 시작했습니다.")
End Sub

 

'Button2의 Click이벤트 핸들러
Private Sub Button2_Click(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Button2.Click  

    '감시를 종료
    watcher.EnableRaisingEvents = False
    watcher.Dispose()
    watcher = Nothing
    Console.WriteLine("감시를 종료했습니다.")
End Sub

 

'이벤트핸들러
Private Sub watcher_Changed(ByVal source As System.Object, _
    ByVal e As System.IO.FileSystemEventArgs)
    Select Case e.ChangeType
        Case System.IO.WatcherChangeTypes.Changed
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 변경되었습니다."))
        Case System.IO.WatcherChangeTypes.Created
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 작성되었습니다."))
        Case System.IO.WatcherChangeTypes.Deleted
            Console.WriteLine(("파일 [" + e.FullPath + _
                "] 이 삭제되었습니다."))
    End Select
End Sub

 

Private Sub watcher_Renamed(ByVal source As System.Object, _
    ByVal e As System.IO.RenamedEventArgs)
    Console.WriteLine(("파일 [" + e.FullPath + _
        "] 의 이름이 변경되었습니다."))
End Sub

 

.Net FrameWork 1.1 ~ 3.5 마이그레이션 작업을 하다보면,

WebProxy.GetDefaultProxy() 에대한 경고가 나온다.

 

HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create(url);

httpWReq.Method = "GET";

...

httpWReq.Proxy = WebProxy.GetDefaultProxy();

 

. NET2. 0이 되어 Obsolete 속성에 변화가 있었습니다.
이 경고를 없애려고, 대체 API를 찾았습니다만 발견되지 않습니다.
몇개의 Web 사이트를 참고해서 아래와같은 내용을 발견했습니다.

 

<configuration >
<system.net>
<defaultProxy>
<proxy usesystemdefault="true" />
</defaultProxy>
</system.net>
</configuration>

 

 

그래서 위의 기술을 추가해 보았습니다만, 실행시에 에러가 되어서 다시 아래를 추가...

 

httpWReq.Proxy = WebRequest.DefaultWebProxy;

 

위와같이 고쳐 써 보았습니다만, 똑같이 실행시 에러....

 

이런.....

 

그래서 혹시나 하는 마음에...

WebProxy.GetDefaultProxy()

요 녀석을 삭제해보았습니다.

헐... 정상기동 됩니다;;

그냥 지우기만 하면 되나봅니다.

쩝.....

+ Recent posts