Public Class NewFp
    Private V_enterToTab As Boolean = False
    Private V_DeleteKey As Boolean = False
    Private V_CurrentDel As Boolean = False
    Private V_FIRSTINDEX As Integer = 0
    Private V_NextRowindex As Integer = -1
    Private A_Ubound As New ArrayList
    Private V_SpaceEdit As Boolean = True
    Private V_sameRHeight As Boolean = True
    Private v_Checkbox_ColIndex As Int16 = -1
    Private v_ACellposLabel As ToolStripStatusLabel = Nothing
    Private v_ACellImeLabel As ToolStripStatusLabel = Nothing
    Private v_AMessageLabel As ToolStripStatusLabel = Nothing
    Private v_AEditStatusLabel As ToolStripStatusLabel = Nothing

    Public 전줄값복사() As String
    Public 한글필드() As String
    Public 다음줄필드명 As String
    Public 기본스타일인덱스 As Short

    Private v_AAutoAddrowInLast As ToolStripButton = Nothing
    'Private V_AButtonAdd As ToolStripButton = Nothing '//추가버튼
    'Private v_AButtonInsert As ToolStripButton = Nothing   '//삽입버튼

    Public Event Arin_DataChanged(ByVal sender As Object, ByVal Status As String) '//미사용
    Public Event Arin_AddRow(ByVal sender As Object, ByVal Status As String)  '//미사용
    Public Event Arin_InsertRow(ByVal sender As Object, ByVal Status As String) '//미사용
    Public Event Arin_AddLog(ByVal sender As Object, ByVal msg As String)
    Public Event Arin_Before_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)  '//키보드가 눌럿을떄 먼저 실행할 함수(뷰의 keydown은 나중에 일어난다)
    Public Event Arin_Before_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs)

    '<System.ComponentModel.Description("한줄추가에 사용할 버튼입니다.")> _
    '   Public Property AButtonAdd() As ToolStripButton
    '    Get
    '        Return Me.V_AButtonAdd
    '    End Get
    '    Set(ByVal value As ToolStripButton)
    '        Me.V_AButtonAdd = value
    '    End Set
    'End Property

    <System.ComponentModel.Description("더이상데이터가없는 마지막줄일때 자동으로 해당 버튼을 클릭해줍니다.")> _
    Public Property AAutoAddrowInLast() As ToolStripButton
        Get
            Return Me.v_AAutoAddrowInLast
        End Get
        Set(ByVal value As ToolStripButton)
            Me.v_AAutoAddrowInLast = value
        End Set
    End Property

    Private Sub Disp_Msg(ByVal msgstr As String)
        If Not v_AMessageLabel Is Nothing Then
            v_AMessageLabel.Text = "[뷰메세지] : " & msgstr & Space(1) & Now.ToString
            v_AMessageLabel.ForeColor = Color.Green
            My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Hand)

        End If

    End Sub
    <System.ComponentModel.Description("현재 편집상태를 보여줄 라벨입니다.")> _
        Public Property AEditStatusLabel() As ToolStripStatusLabel
        Get
            Return Me.v_AEditStatusLabel
        End Get
        Set(ByVal value As ToolStripStatusLabel)
            Me.v_AEditStatusLabel = value
        End Set
    End Property
    <System.ComponentModel.Description("뷰에서 발생하는 메세지를 표시할 라벨입니다.")> _
      Public Property AMessageLabel() As ToolStripStatusLabel
        Get
            Return Me.v_AMessageLabel
        End Get
        Set(ByVal value As ToolStripStatusLabel)
            Me.v_AMessageLabel = value
        End Set
    End Property
    <System.ComponentModel.Description("현재 셀위치를 표시해줄 스텟라벨을 선택합니다")> _
    Public Property ACellposLabel() As ToolStripStatusLabel
        Get
            Return Me.v_ACellposLabel
        End Get
        Set(ByVal value As ToolStripStatusLabel)
            Me.v_ACellposLabel = value
        End Set
    End Property

    <System.ComponentModel.Description("현재 IMe 입력상태를 표시할 라벨을 선택합니다")> _
   Public Property ACellImeLabel() As ToolStripStatusLabel
        Get
            Return Me.v_ACellImeLabel
        End Get
        Set(ByVal value As ToolStripStatusLabel)
            Me.v_ACellImeLabel = value
        End Set
    End Property

    <System.ComponentModel.Description("선택용 체크박스의 인덱스번호를 입력하세요")> _
   Public Property ACheckBox_ColIndex() As Int16
        Get
            Return v_Checkbox_ColIndex
        End Get
        Set(ByVal value As Int16)
            v_Checkbox_ColIndex = value
        End Set
    End Property

    <System.ComponentModel.Description("줄너비가 변경될때 모두 같이 변경됩니다")> _
      Public Property ASameRowheight() As Boolean
        Get
            Return V_sameRHeight
        End Get
        Set(ByVal value As Boolean)
            V_sameRHeight = value
        End Set
    End Property



    <System.ComponentModel.Description("스페이스키를 누르면 편집모드로 들어갑니다")> _
   Public Property AEditFromSpace() As Boolean
        Get
            Return V_SpaceEdit
        End Get
        Set(ByVal value As Boolean)
            V_SpaceEdit = value
        End Set
    End Property

    Public Sub ArinSearch()
        Dim Frow, Fcol As Integer
        Me.Search(Me.ActiveSheetIndex, InputBox("선택된 열에서 검색할 문자를 입력하세요.", "검색문자를 입력하세요"), False, False, False, True, True, False, False, 0, 0, Frow, Fcol)
        If Frow >= 0 AndAlso Fcol >= 0 Then '//검색됫다면
            Me.ActiveSheet.SetActiveCell(Frow, Fcol)
            SendKeys.Send("{ENTER}")
        End If
    End Sub


    ''' <summary>
    ''' 중복검사루틴에서 사용하는 함수
    ''' </summary>
    ''' <param name="num1"></param>
    ''' <param name="num2"></param>
    ''' <param name="Source"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function DupCheckBool(ByVal num1 As Integer, ByVal num2 As Integer, ByVal Source As ArrayList) As Boolean
        If Source Is Nothing Then Return False
        If Source.IndexOf(num1) >= 0 Then Return True
        If Source.IndexOf(num2) >= 0 Then Return True
        Return False
    End Function



    ''' <summary>
    ''' 중복된 데이터를 검색합니다. startindex = 시작할 줄번호,endindex = 종료할 줄번호, source 검색원본의 열번호들, target 검색대상의 열번호들
    ''' 검색완료후 전체 중복된 갯수를 리턴합니다.
    ''' </summary>
    ''' <param name="StartIndex"></param>
    ''' <param name="EndIndex"></param>
    ''' <param name="Source"></param>
    ''' <param name="Tartger"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ADupCheck(ByVal StartIndex As Integer, ByVal EndIndex As Integer, ByVal Source() As Short, ByVal Tartger() As Short, Optional ByVal CheckColnum As Short = -1, Optional ByVal CheckValue As Boolean = True, Optional ByVal 설명열 As Short = -1, Optional ByVal 설명 As String = "", Optional ByVal PBar As ProgressBar = Nothing) As ArrayList
        '''''검색방법은 1번개체부터 마지막개체까지 풀루프를 돌면서 동일한 놈을 찾는다.
        Dim 원본, 대상 As String 'New System.Text.StringBuilder
        Dim DupList As New ArrayList
        Dim fcnt As Integer = 0

        If Not PBar Is Nothing Then
            PBar.Value = StartIndex
            PBar.Minimum = StartIndex
            PBar.Maximum = EndIndex
        End If
        For A As Integer = StartIndex To EndIndex
            'MsgBox(StartIndex & "/" & EndIndex)

            원본 = ""
            For Each T As Short In Source
                원본 &= Me.ActiveSheet.Cells(A, T).Value
            Next

            If 원본.ToString <> "" Then
                For B As Integer = StartIndex To EndIndex
                    If A <> B AndAlso Not DupCheckBool(A, B, DupList) Then   '//같은라인은 피하고 그렇지 않은 라인의 번호를 확인한다.
                        대상 = ""
                        For Each T As Short In Tartger
                            대상 &= Me.ActiveSheet.Cells(B, T).Value
                        Next
                        'MsgBox(원본 & "/" & 대상)

                        If 원본.ToString = 대상.ToString Then
                            'MsgBox(원본)
                            If DupList Is Nothing Then DupList = New ArrayList
                            DupList.Add(A)
                            DupList.Add(B)

                            fcnt += 1
                            If CheckColnum > -1 Then
                                Me.ActiveSheet.Cells(A, CheckColnum).Value = CheckValue
                                Me.ActiveSheet.Cells(B, CheckColnum).Value = CheckValue
                            End If

                            If 설명열 > -1 Then
                                Me.ActiveSheet.Cells(A, 설명열).Value &= "[" & A + 1 & "/" & B + 1 & "]" & 설명 '//설명하도록햇을시에
                                Me.ActiveSheet.Cells(B, 설명열).Value &= "[" & A + 1 & "/" & B + 1 & "]" & 설명 '//설명하도록햇을시에
                            End If

                        End If
                    End If
                Next
            End If
            If Not PBar Is Nothing Then
                If PBar.Value < PBar.Maximum Then PBar.Value += 1
                Me.Invalidate()
            End If
        Next
        Return DupList

        'NOTICE("[전주번호] 중복검사 완료(" & fcnt & "개의 데이터를 찾았습니다)", Me.lb_msg)
    End Function

    Public Function ADupCheck2(ByVal StartIndex As Integer, ByVal EndIndex As Integer, ByVal Source() As Short, ByVal Tartger() As Short, Optional ByVal CheckColnum As Short = -1, Optional ByVal PBar As ProgressBar = Nothing) As Integer
        '''''검색방법은 1번개체부터 마지막개체까지 풀루프를 돌면서 동일한 놈을 찾는다.
        Dim 원본, 대상 As String 'New System.Text.StringBuilder
        Dim fcnt As Integer = 0

        If Not PBar Is Nothing Then
            PBar.Value = StartIndex
            PBar.Minimum = StartIndex
            PBar.Maximum = EndIndex
        End If

        For A As Integer = StartIndex To EndIndex
            원본 = ""
            For Each T As Short In Source
                원본 &= Me.ActiveSheet.Cells(A, T).Value
            Next
            If 원본.Trim.ToString <> "" Then
                For B As Integer = StartIndex To EndIndex
                    If A <> B Then   '//같은라인은 피하고 그렇지 않은 라인의 번호를 확인한다.
                        대상 = ""
                        For Each T As Short In Tartger
                            대상 &= Me.ActiveSheet.Cells(B, T).Value
                        Next
                        If 원본.Trim.ToString = 대상.Trim.ToString Then
                            fcnt += 1
                            If CheckColnum > -1 Then
                                Me.ActiveSheet.Cells(A, CheckColnum).Value = True
                                Me.ActiveSheet.Cells(B, CheckColnum).Value = True
                            End If
                        End If
                    End If
                Next
            End If
            If Not PBar Is Nothing Then
                If PBar.Value < PBar.Maximum Then PBar.Value += 1
                Me.Invalidate()
            End If
        Next
        Return fcnt
        'NOTICE("[전주번호] 중복검사 완료(" & fcnt & "개의 데이터를 찾았습니다)", Me.lb_msg)
    End Function


    ''' <summary>
    ''' 중복검사 같은줄
    ''' </summary>
    ''' <param name="StartIndex"></param>
    ''' <param name="EndIndex"></param>
    ''' <param name="Source"></param>
    ''' <param name="Tartger"></param>
    ''' <param name="CheckColnum"></param>
    ''' <param name="PBar"></param>
    ''' <param name="TrueDirection"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function AdupCheckSR(ByVal StartIndex As Integer, ByVal EndIndex As Integer, ByVal Source() As Short, ByVal Tartger() As Short, Optional ByVal CheckColnum As Short = -1, Optional ByVal PBar As ProgressBar = Nothing, Optional ByVal TrueDirection As Boolean = True) As Integer
        Dim 원본, 대상 As String 'New System.Text.StringBuilder
        Dim fcnt As Integer = 0
        Dim Can As Boolean = False
        If Not PBar Is Nothing Then : PBar.Value = StartIndex : PBar.Minimum = StartIndex : PBar.Maximum = EndIndex : End If

        For A As Integer = StartIndex To EndIndex
            원본 = "" : 대상 = ""
            Can = False
            For Each T As Short In Source
                원본 &= Me.ActiveSheet.Cells(A, T).Value
            Next
            For Each T As Short In Tartger
                대상 &= Me.ActiveSheet.Cells(A, T).Value
            Next

            If 원본.Trim.ToString <> "" Then
                If TrueDirection = True Then
                    If 원본.Trim.ToString = 대상.Trim.ToString Then Can = True
                Else
                    If 원본.Trim.ToString <> 대상.Trim.ToString Then Can = True
                End If
                If Can Then
                    fcnt += 1
                    If CheckColnum > -1 Then Me.ActiveSheet.Cells(A, CheckColnum).Value = True
                End If

            End If
            If Not PBar Is Nothing Then
                If PBar.Value < PBar.Maximum Then PBar.Value += 1
                Me.Invalidate()
            End If
        Next
        Return fcnt

    End Function

    ''' <summary>
    ''' 중복검사 같은줄 공란포함
    ''' </summary>
    ''' <param name="StartIndex"></param>
    ''' <param name="EndIndex"></param>
    ''' <param name="Source"></param>
    ''' <param name="Tartger"></param>
    ''' <param name="CheckColnum"></param>
    ''' <param name="PBar"></param>
    ''' <param name="TrueDirection"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ADupCheckSr_inBlank(ByVal StartIndex As Integer, ByVal EndIndex As Integer, ByVal Source() As Short, ByVal Tartger() As Short, Optional ByVal CheckColnum As Short = -1, Optional ByVal PBar As ProgressBar = Nothing, Optional ByVal TrueDirection As Boolean = True) As Integer
        Dim 원본, 대상 As String 'New System.Text.StringBuilder
        Dim fcnt As Integer = 0
        Dim Can As Boolean = False
        If Not PBar Is Nothing Then : PBar.Value = StartIndex : PBar.Minimum = StartIndex : PBar.Maximum = EndIndex : End If

        For A As Integer = StartIndex To EndIndex
            원본 = "" : 대상 = ""
            Can = False
            For Each T As Short In Source
                원본 &= Me.ActiveSheet.Cells(A, T).Text
            Next
            For Each T As Short In Tartger
                대상 &= Me.ActiveSheet.Cells(A, T).Text
            Next

            If TrueDirection = True Then
                If 원본.Trim.ToString = 대상.Trim.ToString Then Can = True
            Else
                If 원본.Trim.ToString <> 대상.Trim.ToString Then Can = True
            End If

            If Can Then
                fcnt += 1
                If CheckColnum > -1 Then Me.ActiveSheet.Cells(A, CheckColnum).Value = True
            End If

            If Not PBar Is Nothing Then
                If PBar.Value < PBar.Maximum Then PBar.Value += 1
                Me.Invalidate()
            End If
        Next
        Return fcnt

    End Function

    ''' <summary>
    ''' 현재위치 위에 새로운 행을 추가합니다(바운드 적용됨)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AInsertNewRow()
        If Not Me.Focused Then Me.Focus()
        Me.ActiveSheet.Rows.Add(Me.ActiveSheet.ActiveRowIndex, 1)
        Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.ActiveRowIndex, Me.AFirstColumn_Index)
    End Sub

    ''' <summary>
    ''' 마지막에 새로운 행을 추가합니다(바운드 적용됨)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AAddNewRow()
        If Not Me.Focused Then Me.Focus()
        'Me.ActiveSheet.RowCount += 1
        Me.ActiveSheet.Rows.Add(Me.ActiveSheet.RowCount, 1)
        Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.RowCount, Me.AFirstColumn_Index)
        SendKeys.Send("{UP}")
        SendKeys.Send("{DOWN}")
    End Sub

    ''' <summary>
    ''' 마지막에 새로운 행을 추가합니다.(바운드적용안됨)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AAddNewRowU()
        If Not Me.Focused Then Me.Focus()
        Dim Idx As Integer
        Me.ActiveSheet.AddUnboundRows(Me.ActiveSheet.RowCount, 1)
        Idx = Me.ActiveSheet.RowCount - 1
        Me.ActiveSheet.Rows(Idx).Tag = "UNBOUND"
        Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.RowCount, AFirstColumn_Index)
        SendKeys.Send("{ENTER}")
    End Sub

    <System.ComponentModel.Description("줄바꿈을 할 열 번호입니다")> _
      Public Property ANextRow_ColIndex() As Integer
        Get
            Return V_NextRowindex
        End Get
        Set(ByVal value As Integer)
            V_NextRowindex = value
        End Set
    End Property
    <System.ComponentModel.Description("줄이 바뀌었을때 커서가 위치할 시작 값입니다.")> _
   Public Property AFirstColumn_Index() As Integer
        Get
            Return V_FIRSTINDEX

        End Get
        Set(ByVal value As Integer)
            V_FIRSTINDEX = value
        End Set
    End Property

    <System.ComponentModel.Description("Del 키를 누를시 커서가 위치한 셀의 값을 초기합니다")> _
Public Property ADeleteCell() As Boolean
        Get
            Return V_CurrentDel

        End Get
        Set(ByVal value As Boolean)
            V_CurrentDel = value
        End Set
    End Property

    <System.ComponentModel.Description("Shift+Del 키를 누를시 해당 줄을 삭제합니다.")> _
       Public Property ADeleteRow() As Boolean
        Get
            Return V_DeleteKey

        End Get
        Set(ByVal value As Boolean)
            V_DeleteKey = value
        End Set
    End Property


    ''' <summary>
    ''' 커서를 다음셀로 이동 (문제가 좀 있다 열너비 0인것들에대해서
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ANext_Cell()
        '//커서를 다음셀로 이동한다. 다음셀의 너비가 0이거나 tabstop 이 false 이면 그 다음으로 이동한다.
        Dim index As Integer = 0
Start:
        index += 1
        If Me.ActiveColumnindex + index >= Me.ActiveSheet.Columns.Count Then
            RaiseEvent Arin_AddLog(Me, "[ANEXT_CELL] 다음열번호가 마지막열이므로 리턴(현재열번호/전체카운트:" & Me.ActiveColumnindex + index & "/" & Me.ActiveSheet.Columns.Count)
            If Me.ActiveRowindex = Me.ActiveSheet.RowCount - 1 Then '//마지막줄에걸렷으면 추가
                If Not Me.v_AAutoAddrowInLast Is Nothing Then v_AAutoAddrowInLast.PerformClick()
                RaiseEvent Arin_AddLog(Me, "[ANEXT_CELL] 다음열번호가 마지막열이므로 한줄추가해야겠다.(현재열번호/전체카운트:" & Me.ActiveColumnindex + index & "/" & Me.ActiveSheet.Columns.Count)
            Else
                RaiseEvent Arin_AddLog(Me, "[ANEXT_CELL] 다음열번호가 마지막열이므로 다음줄로가야할경우같다(현재열번호/전체카운트:" & Me.ActiveColumnindex + index & "/" & Me.ActiveSheet.Columns.Count)
                Me.ANEXT_ROW()
            End If
            Return '//마지막열이라면 그냥 리턴
        End If
        
        If Me.ActiveSheet.Columns(Me.ActiveColumnindex + index).Width = 0 Or Me.ActiveSheet.Columns(Me.ActiveColumnindex + index).TabStop = False Then
            GoTo Start
        End If
        SendKeys.Send(vbTab)
        'Me.ActiveSheet.SetActiveCell(Me.ActiveRowindex, Me.ActiveColumnindex + index)

        'If Me.ActiveSheet.ActiveRowIndex <> Me.ActiveSheet.RowCount - 1 Then '//마지막줄이 아니면
        '    If Me.ActiveSheet.ActiveColumnIndex = Me.ANextRow_ColIndex OrElse Me.ActiveSheet.ActiveColumnIndex = Me.ActiveSheet.ColumnCount - 1 Then '/마지막열이면 다음줄 첨으로 이동
        '        'SendKeys.Send("{TAB}")
        '        MsgBox(Me.ActiveSheet.ActiveColumnIndex & "/" & Me.AFirstColumn_Index)
        '        Me.ActiveSheet.ActiveRowIndex += 1
        '        Me.ActiveSheet.ActiveColumnIndex = V_FIRSTINDEX '//첫인덱스로 옴긴다.기본값은 0이다.
        '        'Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.ActiveRowIndex + 1, V_FIRSTINDEX)

        '    Else
        '        'SendKeys.Send("{TAB}")
        '        'Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex + 1)
        '        'Me.ActiveSheet.IsSelected(Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex + 1)
        '        'ME.ActiveSheet.SEL
        '            If Me.ActiveSheet.Columns(Me.ActiveColumnindex + 1).Width = 0 Or  Then
        '            GoTo Start
        '        Else
        '            Me.ActiveSheet.ActiveColumnIndex += 1
        '        End If


        '    End If
        'Else   '//마지막줄일때
        '    If Me.ActiveSheet.ActiveColumnIndex = Me.ANextRow_ColIndex OrElse Me.ActiveSheet.ActiveColumnIndex <> Me.ActiveSheet.ColumnCount - 1 Then '/마지막열이면 다음줄 첨으로 이동
        '        'Me.ActiveSheet.ActiveRowIndex += 1
        '        If Not Me.AAutoAddrowInLast Is Nothing Then
        '            Me.AAutoAddrowInLast.PerformClick()
        '        End If
        '    Else
        '        If Me.ActiveSheet.Columns(Me.ActiveColumnindex + 1).Width = 0 Then
        '            GoTo Start
        '        Else
        '            Me.ActiveSheet.ActiveColumnIndex += 1
        '        End If
        '    End If


        Dim Ee As New FarPoint.Win.Spread.EnterCellEventArgs(Nothing, Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex)
        NewFp_EnterCell(Nothing, Ee)   '//이후에 엔터셀이 발생하지않으므로 발생시켜준다.
        'End If
    End Sub

    ''' <summary>
    ''' 커서를 이전셀로 이동
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub APrev_Cell()
        If Me.ActiveSheet.ActiveRowIndex <> 0 Then '//첫줄이 아니면
            If Me.ActiveSheet.ActiveColumnIndex = 0 Then '/첫열이면 이전줄 첨으로 이동
                'SendKeys.Send("{TAB}")
                Me.ActiveSheet.ActiveRowIndex -= 1
                Me.ActiveSheet.ActiveColumnIndex = V_FIRSTINDEX '//첫인덱스로 옴긴다.기본값은 0이다.
                'Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.ActiveRowIndex + 1, V_FIRSTINDEX)

            Else
                'SendKeys.Send("{TAB}")
                'Me.ActiveSheet.SetActiveCell(Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex + 1)
                'Me.ActiveSheet.IsSelected(Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex + 1)
                'ME.ActiveSheet.SEL
                Me.ActiveSheet.ActiveColumnIndex -= 1
            End If
        Else
            If Me.ActiveSheet.ActiveColumnIndex <> 0 Then '/첫열이 아니면
                'Me.ActiveSheet.ActiveRowIndex += 1
                Me.ActiveSheet.ActiveColumnIndex -= 1 '//첫인덱스로 옴긴다.기본값은 0이다.
            End If
        End If
    End Sub

    ''' <summary>
    ''' 커서를 다음줄로 이동
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ANEXT_ROW()
        If Me.ActiveSheet.ActiveRowIndex <> (Me.ActiveSheet.RowCount - 1) Then '//마지막줄이 아니면
            Me.ActiveSheet.ActiveRowIndex += 1
            Me.ActiveSheet.ActiveColumnIndex = V_FIRSTINDEX '//첫인덱스로 옴긴다.기본값은 0이다.                
        End If
        Dim Ee As New FarPoint.Win.Spread.EnterCellEventArgs(Nothing, Me.ActiveSheet.ActiveRowIndex, Me.ActiveSheet.ActiveColumnIndex)
        NewFp_EnterCell(Nothing, Ee)   '//이후에 엔터셀이 발생하지않으므로 발생시켜준다.
    End Sub

    ''' <summary>
    ''' 커서를 이전줄로 이동
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub APrev_ROW()
        If Me.ActiveSheet.ActiveRowIndex <> 0 Then '//첫줄이 아니면
            Me.ActiveSheet.ActiveRowIndex -= 1
            Me.ActiveSheet.ActiveColumnIndex = V_FIRSTINDEX '//첫인덱스로 옴긴다.기본값은 0이다.        
        End If
    End Sub

    ''' <summary>
    ''' 선택줄번호에의하거나 입력한 열번호에 True 값을 전달합니다.(체크박스 체크용도)
    ''' </summary>
    ''' <param name="Columnindex"></param>
    ''' <remarks></remarks>
    Public Sub ASelect(Optional ByVal Columnindex As Int16 = -1)
        Dim sheet As FarPoint.Win.Spread.SheetView = Me.ActiveSheet
        If Columnindex = -1 AndAlso Me.ACheckBox_ColIndex <> -1 Then Columnindex = Me.ACheckBox_ColIndex '//지정된열제목이 잇는지
        sheet.AutoFilterReset(Columnindex)
        For i As Integer = 0 To sheet.RowCount - 1
            sheet.Cells(i, Columnindex).Value = True
        Next
    End Sub

    ''' <summary>
    ''' 선택줄번호에의하거나 입력된 열번호에 FALSE 값을 전달합니다..(체크박스 해제용도)
    ''' </summary>
    ''' <param name="index"></param>
    ''' <remarks></remarks>
    Public Sub AUnselect(Optional ByVal index As Int16 = -1)
        Dim sheet As FarPoint.Win.Spread.SheetView = Me.ActiveSheet
        If index = -1 AndAlso Me.ACheckBox_ColIndex <> -1 Then index = Me.ACheckBox_ColIndex '//지정된열제목이 잇는지
        sheet.AutoFilterReset(index)
        For i As Integer = 0 To sheet.RowCount - 1
            sheet.Cells(i, index).Value = False
        Next
    End Sub

    ''' <summary>
    ''' checkbox_colindex에의하거나 입력된 열번호를 가지고 선택반전 시킵니다.(체크박스 반전)
    ''' </summary>
    ''' <param name="index"></param>
    ''' <remarks></remarks>
    Public Sub AReverse(Optional ByVal index As Int16 = -1)
        Dim sheet As FarPoint.Win.Spread.SheetView = Me.ActiveSheet
        If index = -1 AndAlso Me.ACheckBox_ColIndex <> -1 Then index = ACheckBox_ColIndex '//지정된열제목이 잇는지
        sheet.AutoFilterReset(index)
        For i As Integer = 0 To sheet.RowCount - 1
            sheet.Cells(i, index).Value = IIf(sheet.Cells(i, index).Value = True, False, True)
        Next
    End Sub


    ''' <summary>
    ''' 입력된 줄번호와 태그=데이터필드 가 일치하는 셀을 반환합니다.
    ''' </summary>
    ''' <param name="index"></param>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells(ByVal index As Integer, ByVal Tag As Object, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex

        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns

            If SC.DataField.ToUpper = Tag.ToString.ToUpper Then
                RetVal = Me.Sheets(Sheetindex).Cells(index, SC.Index)
                Exit For
            End If
        Next
        If RetVal Is Nothing Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function
    ''' <summary>
    ''' 현재선택된 줄의 열번호에해당하는 셀을 반환합니다.
    ''' </summary>
    ''' <param name="Columnindex"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells(ByVal Columnindex As Integer, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        Return Me.Sheets(Sheetindex).Cells(Me.ActiveSheet.ActiveRowIndex, Columnindex)
        Return RetVal
    End Function
    ''' <summary>
    ''' 현재선택된 셀을 반환합니다
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells() As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        Return Me.ActiveSheet.Cells(Me.ActiveRowindex, Me.ActiveColumnindex)
        Return RetVal
    End Function


    ''' <summary>
    ''' 전줄의 현재열위치 셀을 반환
    ''' </summary>
    ''' <param name="FirstrowValueisNothing"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CellsPR(Optional ByVal FirstrowValueisNothing As Boolean = False) As FarPoint.Win.Spread.Cell
        If FirstrowValueisNothing AndAlso Me.ActiveRowindex = 0 Then Return Nothing

        If Me.ActiveRowindex = 0 Then
            If FirstrowValueisNothing Then
                Return Nothing
            Else
                Return Me.ActiveSheet.ActiveCell
            End If
        Else
            Return Me.ActiveSheet.Cells(Me.ActiveRowindex - 1, Me.ActiveColumnindex)
        End If
    End Function
    ''' <summary>
    ''' 앞셀을 반환
    ''' </summary>
    ''' <param name="FirstColValueisNothing"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CellsPC(Optional ByVal FirstColValueisNothing As Boolean = False) As FarPoint.Win.Spread.Cell
        If FirstColValueisNothing AndAlso Me.ActiveColumnindex = 0 Then Return Nothing

        If Me.ActiveColumnindex = 0 Then
            If FirstColValueisNothing Then
                Return Nothing
            Else
                Return Me.ActiveSheet.ActiveCell
            End If
        Else
            Return Me.ActiveSheet.Cells(Me.ActiveRowindex, Me.ActiveColumnindex - 1)
        End If
    End Function
    ''' <summary>
    ''' 입력된 태그와 데이터필드가 일치하는 셀을 반환합니다.(줄번호는 현재줄)
    ''' </summary>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells(ByVal Tag As Object, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex

        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns

            If SC.DataField.ToUpper = Tag.ToString.ToUpper Then
                RetVal = Me.Sheets(Sheetindex).Cells(Me.ActiveRowindex, SC.Index)
                Exit For
            End If
        Next
        If RetVal Is Nothing Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function

    ''' <summary>
    ''' 입력된 태그와 데이터필드가 일치하는 셀을 반환합니다.(줄번호는 전줄)
    ''' </summary>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CellsR(ByVal Tag As Object, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        Dim Rindex As Integer = Me.ActiveSheet.ActiveRowIndex : If Rindex > 0 Then Rindex -= 1

        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex

        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns

            If SC.DataField.ToUpper = Tag.ToString.ToUpper Then
                RetVal = Me.Sheets(Sheetindex).Cells(Rindex, SC.Index)
                Exit For
            End If
        Next
        If RetVal Is Nothing Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function

    ''' <summary>
    '''  입력된태그(태그는 레이블명)와 일치하는 셀을 반환합니다.(줄번호는 현재줄)
    ''' </summary>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells2(ByVal Tag As String, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns
            If SC.Label.ToUpper = Tag.ToString.ToUpper Then
                RetVal = Me.Sheets(Sheetindex).Cells(Me.ActiveRowindex, SC.Index)
                Exit For
            End If
        Next
        If RetVal Is Nothing Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function

    ''' <summary>
    '''  입력된태그(태그는 레이블명)와 일치하는 열을 반환합니다.(줄번호는 현재줄)
    ''' </summary>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Column2(ByVal Tag As String, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Column
        Dim RetVal As FarPoint.Win.Spread.Column = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns
            If SC.Label.ToUpper = Tag.ToString.ToUpper Then
                Return SC
            End If
        Next
        MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function column2")
        Return Nothing
    End Function

    ''' <summary>
    ''' 필드레이블과 일치하는 열의 위치를 반환합니다.
    ''' </summary>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ColIndex2(ByVal Tag As String, Optional ByVal Sheetindex As Integer = -1) As Integer
        Dim RetVal As Integer = -1
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns
            If SC.Label.ToUpper = Tag.ToString.ToUpper Then
                RetVal = SC.Index
                Exit For
            End If
        Next
        If RetVal = -1 Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function

    ''' <summary>
    ''' 열의 데이터필드와 일치하는열 번호를 반환
    ''' </summary>
    ''' <param name="DataField"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ColIndex(ByVal DataField As String, Optional ByVal Sheetindex As Integer = -1) As Integer
        Dim RetVal As Integer = -1
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns
            If SC.DataField.ToUpper = DataField.ToString.ToUpper Then
                RetVal = SC.Index
                Exit For
            End If
        Next
        If RetVal = -1 Then
            MsgBox("Can't Find column [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function

    ''' <summary>
    ''' 입력된태그(레이블명)와 일치하는 셀을 반환합니다.
    ''' </summary>
    ''' <param name="RowIndex"></param>
    ''' <param name="Tag"></param>
    ''' <param name="Sheetindex"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Cells2(ByVal RowIndex As Integer, ByVal Tag As String, Optional ByVal Sheetindex As Integer = -1) As FarPoint.Win.Spread.Cell
        Dim RetVal As FarPoint.Win.Spread.Cell = Nothing
        If Sheetindex = -1 Then Sheetindex = Me.ActiveSheetIndex
        For Each SC As FarPoint.Win.Spread.Column In Me.Sheets(Sheetindex).Columns
            If SC.Label.ToUpper = Tag.ToString.ToUpper Then
                RetVal = Me.Sheets(Sheetindex).Cells(RowIndex, SC.Index)
                Exit For
            End If
        Next
        If RetVal Is Nothing Then
            MsgBox("Can't Find column Label [" & Tag.ToString & "]", MsgBoxStyle.Critical, "Farpoint function Cells")
        End If
        Return RetVal
    End Function


    ''' <summary>
    ''' 전줄을 반환합니다
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetProw() As FarPoint.Win.Spread.Row
        If Me.ActiveSheet.ActiveRowIndex = 0 Then Return Me.ActiveSheet.ActiveRow
        Return Me.ActiveSheet.Rows(Me.ActiveSheet.ActiveRowIndex - 1)
    End Function

    ''' <summary>
    ''' 활성화된 열제목줄을 반환합니다.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ActiveColumn() As FarPoint.Win.Spread.Column
        Return Me.ActiveSheet.Columns(Me.ActiveColumnindex)
    End Function

    ''' <summary>
    ''' 활성화된 줄번호를 반환
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ActiveRowindex() As Integer
        Return Me.ActiveSheet.ActiveRowIndex
    End Function
    ''' <summary>
    ''' 활성화된 열버호를 반환
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ActiveColumnindex() As Integer
        Return Me.ActiveSheet.ActiveColumnIndex
    End Function

    Public Sub AViewSetting_Load(ByVal 전줄값복사 As String, ByVal 한글필드 As String, ByVal 다음줄열이름 As String, Optional ByVal Tag As String = "", Optional ByVal FN As String = "")
        '//파라미터는 기본값이다 ini파일에 존재하지않았을경우 사용한다.
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & FN & "spread.INI")
        Dim a As New tinyIni(File.FullName)

        If a.Exist = False Then Me.AViewSetting_Save(전줄값복사, 한글필드, 다음줄열이름, Tag, FN)

        Dim 전줄, 한글, 다음줄 As String
        Dim v기본스타일인덱스 As Short
        전줄 = a.Read(Me.Parent.Name & "-" & (Me.Name & Tag), "prerowcopy", 전줄값복사)
        한글 = a.Read(Me.Parent.Name & "-" & (Me.Name & Tag), "hangulfield", 한글필드)
        다음줄 = a.Read(Me.Parent.Name & "-" & (Me.Name & Tag), "nextcolumn", 다음줄열이름)
        v기본스타일인덱스 = a.Read(Me.Parent.Name & "-" & (Me.Name & Tag), "defstyleindex", 0)

        Me.전줄값복사 = 전줄.Split(",")
        Me.한글필드 = 한글.Split(",")
        Me.다음줄필드명 = 다음줄
        Me.기본스타일인덱스 = v기본스타일인덱스

    End Sub
    Public Sub AViewSetting_Save(ByVal 전줄값복사 As String, ByVal 한글필드 As String, ByVal 다음줄열이름 As String, ByVal 기본스타일인덱스 As Short, Optional ByVal Tag As String = "", Optional ByVal FN As String = "")
        '//파라미터는 기본값이다 ini파일에 존재하지않았을경우 사용한다.
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & FN & "spread.INI")
        Dim a As New tinyIni(File.FullName)
        If a.Exist = False Then a.Create()
        a.Write(Me.Parent.Name & "-" & (Me.Name & Tag), "prerowcopy", 전줄값복사)
        a.Write(Me.Parent.Name & "-" & (Me.Name & Tag), "hangulfield", 한글필드)
        a.Write(Me.Parent.Name & "-" & (Me.Name & Tag), "nextcolumn", 다음줄열이름)
        a.Write(Me.Parent.Name & "-" & (Me.Name & Tag), "defstyleindex", 기본스타일인덱스)

    End Sub


    ''' <summary>
    ''' 뷰의 열너비,열이름(옵션),줌팩터등을 저장합니다.
    ''' </summary>
    ''' <param name="ColName"></param>
    ''' <remarks></remarks>
    Public Sub ASetting_Save(Optional ByVal ColName As Boolean = True, Optional ByVal Tag As String = "", Optional ByVal FN As String = "")
        ColSize_Save(Tag, FN)
        If ColName Then ColName_Save(Tag, FN)
        CurrentState_Save(Tag, FN)
        AZOOM_Save(Tag, FN)
    End Sub
    ''' <summary>
    ''' 뷰의 열너비,열이름(옵션),줌팩터등을 불러옵니다
    ''' </summary>
    ''' <param name="ColName"></param>
    ''' <remarks></remarks>
    Public Sub ASetting_Load(Optional ByVal ColName As Boolean = True, Optional ByVal Tag As String = "", Optional ByVal FN As String = "")
        ColSize_Load(Tag, FN)
        If ColName Then ColName_Load(Tag, FN)
        CurrentState_Load(Tag, FN)
        AZOOM_LOAD(Tag, FN)
    End Sub

    ''' <summary>
    ''' 현재 열너비를 Spread.ini 파일에 저장합니다.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AZOOM_Save(ByVal tag As String, ByVal fn As String)
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & fn & "spread.INI")
        If System.IO.Directory.Exists(File.DirectoryName) = False Then System.IO.Directory.CreateDirectory(File.DirectoryName)
        Dim a As New tinyIni(File.FullName)
        a.Write(Me.Parent.Name & "-" & (Me.Name & tag), "ZOOM", Me.ActiveSheet.ZoomFactor)

    End Sub
    ''' <summary>
    ''' 현재 열너비를 Spread.ini 파일로 부터 불러옵니다.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AZOOM_LOAD(ByVal tag As String, ByVal fn As String)
        Dim FILEname As String = My.Application.Info.DirectoryPath & "\" & fn & "spread.INI"
        If Not System.IO.File.Exists(FILEname) Then
            MsgBox("열너비 파일이 존재하지 않습니다", MsgBoxStyle.Critical, "열너비설정-오류")
            ColSize_Save(tag, fn)
            Return
        End If
        'MsgBox("PARENT" & Me.Parent.Name.ToString & "/" & Me.Parent.Text)
        Dim a As New tinyIni(FILEname)
        Me.ActiveSheet.ZoomFactor = a.Read(Me.Parent.Name & "-" & (Me.Name & tag), "ZOOM", 1)



    End Sub
    ''' <summary>
    ''' 현재 열너비를 Spread.ini 파일에 저장합니다.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ColSize_Save(ByVal tag As String, ByVal fn As String)
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & fn & "spread.INI")
        If System.IO.Directory.Exists(File.DirectoryName) = False Then System.IO.Directory.CreateDirectory(File.DirectoryName)
        Dim a As New tinyIni(File.FullName)
        For Each z As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
            a.Write(Me.Parent.Name & "-" & (Me.Name & tag), "COLSIZE" & z.Index.ToString, z.Width)
        Next
    End Sub

    ''' <summary>
    ''' 현재 열너비를 Spread.ini 파일로 부터 불러옵니다.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ColSize_Load(ByVal tag As String, ByVal fn As String)
        Dim FILEname As String = My.Application.Info.DirectoryPath & "\" & fn & "spread.INI"
        If Not System.IO.File.Exists(FILEname) Then
            MsgBox("열너비 파일이 존재하지 않습니다", MsgBoxStyle.Critical, "열너비설정-오류")
            ColSize_Save(tag, fn)
            Return
        End If
        'MsgBox("PARENT" & Me.Parent.Name.ToString & "/" & Me.Parent.Text)
        Dim a As New tinyIni(FILEname)
        For Each col As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
            'MsgBox(COL.Index)
            'a.Write(Me.Parent.Name, "COLSIZE" & COL.Index.ToString, File, COL.Width)
            Try
                col.Width = a.Read(Me.Parent.Name & "-" & (Me.Name & tag), "COLSIZE" & col.Index.ToString)
            Catch ex As Exception   '//없을경우에는 에러를 내므로 그냥 나간다

            End Try
        Next
    End Sub

    Public Sub ColSize_Init()
        For Each col As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
            'MsgBox(COL.Index)
            'a.Write(Me.Parent.Name, "COLSIZE" & COL.Index.ToString, File, COL.Width)
            Try
                col.Width = 100 ' a.Read(Me.Parent.Name & "-" & (Me.Name & tag), "COLSIZE" & col.Index.ToString)
            Catch ex As Exception   '//없을경우에는 에러를 내므로 그냥 나간다

            End Try
        Next
    End Sub

    Public Sub ColName_Load(ByVal tag As String, ByVal fn As String)
        Dim FILEname As String = My.Application.Info.DirectoryPath & "\" & fn & "spread.INI"

        If Not System.IO.File.Exists(FILEname) Then
            MsgBox("열너비 파일이 존재하지 않습니다", MsgBoxStyle.Critical, "열너비설정-오류")
            ColSize_Save(tag, fn)
            Return
        End If
        'MsgBox("PARENT" & Me.Parent.Name.ToString & "/" & Me.Parent.Text)
        Dim a As New tinyIni(FILEname)
        For Each col As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
            'MsgBox(COL.Index)
            'a.Write(Me.Parent.Name, "COLSIZE" & COL.Index.ToString, File, COL.Width)
            Try
                col.Label = a.Read(Me.Parent.Name & "-" & Me.Name & tag, "COLNAME" & col.Index.ToString).ToString.Trim(Chr(0))
            Catch ex As Exception   '//없을경우에는 에러를 내므로 그냥 나간다
            End Try
        Next
    End Sub
    Public Sub ColName_Save(ByVal tag As String, ByVal fn As String)
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & fn & "spread.INI")
        If System.IO.Directory.Exists(File.DirectoryName) = False Then System.IO.Directory.CreateDirectory(File.DirectoryName)
        Dim a As New tinyIni(File.FullName)
        For Each z As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
            a.Write(Me.Parent.Name & "-" & Me.Name & tag, "COLNAME" & z.Index.ToString, z.Label)
        Next
    End Sub

    ''' <summary>
    ''' [보충요망] :줄높이를 저장
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CurrentState_Save(ByVal tag As String, ByVal fn As String)
        Dim File As New System.IO.FileInfo(My.Application.Info.DirectoryPath & "\" & fn & "spread.INI")
        If System.IO.Directory.Exists(File.DirectoryName) = False Then System.IO.Directory.CreateDirectory(File.DirectoryName)
        Dim a As New tinyIni(File.FullName)
        a.Write(Me.Parent.Name & "-" & Me.Name & tag, "RowHeight", Me.ActiveSheet.Rows.Default.Height)
    End Sub

    ''' <summary>
    ''' [보충요망] :줄높이를 불러온다.(spre.ini)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CurrentState_Load(ByVal tag As String, ByVal fn As String)
        Dim a As New tinyIni(My.Application.Info.DirectoryPath & "\" & fn & "spread.INI")
        If Not a.Exist Then
            MsgBox("열너비 파일이 존재하지 않습니다", MsgBoxStyle.Critical, "열너비설정-오류")
            CurrentState_Save(tag, fn)
            a = Nothing
            Return
        End If

        '//파일이 존재할때 불러온다.
        Me.ActiveSheet.Rows.Default.Height = a.Read(Me.Parent.Name & "-" & Me.Name & tag, "RowHeight", 20)
        a = Nothing
    End Sub

    Private Sub Delete_itm(Optional ByVal rowindex As Integer = -1, Optional ByVal prompt As Boolean = True)
        Dim Commit As Boolean = True
        Dim A As New System.Text.StringBuilder("경고 : 데이터 삭제를 선택했습니다")
        A.AppendLine()
        A.AppendLine("현재 선택된 줄이 삭제됩니다")
        A.AppendLine("계속하시겠습니까?")
        If prompt Then
            If MsgBox(A.ToString, MsgBoxStyle.Critical + MsgBoxStyle.OkCancel, "선택줄 삭제") <> MsgBoxResult.Ok Then Commit = False
        End If
        If Not Commit Then Return '//명령프롬프트에서 취소를 선택햇을시에는  빠져나간다.
        Me.ActiveSheet.ActiveRow.Remove()
    End Sub

    Private Sub NewFp_Change(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChangeEventArgs) Handles Me.Change
        If e.Column = Me.ACheckBox_ColIndex AndAlso Me.ActiveSheet.Cells(e.Row, Me.ACheckBox_ColIndex).Value = True Then   '//선택
            Me.ActiveSheet.Rows(e.Row).BackColor = Color.LightGreen
        Else
            Me.ActiveSheet.Rows(e.Row).BackColor = Color.White
        End If
    End Sub

    Private Sub NewFp_EditModeOff(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EditModeOff
        RaiseEvent Arin_Before_EditModeOff(sender, e)   '//원래뷰가 after 발생이므로 before 발생용 이벤트하나 맹글어준다.

        If Not Me.v_AEditStatusLabel Is Nothing Then '//라벨이 되어있다면
            Me.v_AEditStatusLabel.Text = "[이동]"
            Me.v_AEditStatusLabel.ForeColor = Color.Black
        End If
        '//빠져나올때 이 셀번호가 종료열번호라면 다음줄로 넘긴다
        If (Me.ANextRow_ColIndex = Me.ActiveSheet.ActiveColumnIndex) OrElse (Me.ActiveSheet.ActiveColumnIndex = (Me.ActiveSheet.ColumnCount - 1)) Then '//다음줄로가아햘 경우라면
            RaiseEvent Arin_AddLog(Me, "editmode off  and next_row")
            Me.ANEXT_ROW()
        Else
            RaiseEvent Arin_AddLog(Me, "editmode off nextcell")
            Me.ANext_Cell()
        End If
    End Sub

    Private Sub NewFp_EditModeOn(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EditModeOn
        RaiseEvent Arin_AddLog(Me, "editmode on")
        If Not Me.v_AEditStatusLabel Is Nothing Then '//라벨이 되어있다면
            Me.v_AEditStatusLabel.Text = "[편집]"
            Me.v_AEditStatusLabel.ForeColor = Color.Red
        End If
    End Sub

    Private Sub NewFp_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Enter

    End Sub

    ''' <summary>
    ''' 셀에 진입햇을시의 프로시져.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub NewFp_EnterCell(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.EnterCellEventArgs) Handles Me.EnterCell
        If Not Me.v_ACellposLabel Is Nothing Then
            Me.v_ACellposLabel.Text = "[" & Me.ActiveSheet.ActiveRowIndex + 1 & ":" & Me.ActiveSheet.ActiveColumnIndex & "/" & Me.ActiveSheet.RowCount & "]"
        End If

        ' Me.Text = Me.view1.한글필드.GetUpperBound(0) & "/" & Array.IndexOf(Me.view1.한글필드, .ActiveColumn.Label)
        If Not Me.한글필드 Is Nothing AndAlso Me.한글필드.GetUpperBound(0) >= 0 Then
            If Array.IndexOf(Me.한글필드, Me.ActiveColumn.Label) >= 0 Then
                Me.ImeMode = Windows.Forms.ImeMode.Hangul
            Else
                If Not Me.ActiveColumn.Tag Is Nothing Then
                    If Array.IndexOf(Me.한글필드, Me.ActiveColumn.Tag) >= 0 Then
                        Me.ImeMode = Windows.Forms.ImeMode.Hangul
                    Else
                        Me.ImeMode = Windows.Forms.ImeMode.Alpha
                    End If
                Else
                    If Not Me.ActiveColumn.DataField Is Nothing Then
                        If Array.IndexOf(Me.한글필드, Me.ActiveColumn.DataField) >= 0 Then
                            Me.ImeMode = Windows.Forms.ImeMode.Hangul
                        Else
                            Me.ImeMode = Windows.Forms.ImeMode.Alpha
                        End If
                    Else
                        Me.ImeMode = Windows.Forms.ImeMode.Alpha
                    End If
                End If
            End If
        End If


        'If Not Me.v_ACellImeLabel Is Nothing Then--이부분은 Imemodechange 이벤트로 대체됫다
        '    If Me.ImeMode = Windows.Forms.ImeMode.Hangul Then
        '        'MsgBox("한글이다")
        '        Me.v_ACellImeLabel.Text = ("[한글]")
        '        Me.v_ACellImeLabel.ForeColor = Color.Blue
        '    Else
        '        '  MsgBox("일반으로변경")
        '        Me.v_ACellImeLabel.Text = ("[일반]")
        '        Me.v_ACellImeLabel.ForeColor = Color.Black
        '    End If
        'End If
    End Sub

    Private Sub NewFp_ImeModeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ImeModeChanged
        If Not Me.v_ACellImeLabel Is Nothing Then
            If Me.ImeMode = Windows.Forms.ImeMode.Hangul Then
                Me.v_ACellImeLabel.Text = ("[한글]")
                Me.v_ACellImeLabel.ForeColor = Color.Blue
            Else
                Me.v_ACellImeLabel.Text = ("[일반]")
                Me.v_ACellImeLabel.ForeColor = Color.Black
            End If
        End If
    End Sub


    ''' <summary>
    ''' 엔터키를 누르면 다음셀로이동하는 키맵을 설정합니다.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AEnterToNextItem(Optional ByVal EditOff As Boolean = True)
        Dim im As New FarPoint.Win.Spread.InputMap
        If EditOff Then
            im = Me.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
            im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumn)
        End If
        im = Me.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
        im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.MoveToNextColumn) '//자동줄넘김은 사용하지않는다.
        'im.Put(New FarPoint.Win.Spread.Keystroke(Keys.Enter, Keys.None), FarPoint.Win.Spread.SpreadActions.)
    End Sub

    ''' <summary>
    ''' keydown 이벤트가 뷰내에서 처리될때 먼저 발생하는 이벤트
    ''' </summary>
    ''' <remarks></remarks>
    Overridable Sub Pre_KeyDown()

    End Sub


    ''' <summary>
    ''' 뷰에서 키보드가 눌렷을대의 반응
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub CustFP_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        RaiseEvent Arin_AddLog(Me, "keydown 발생 코드=" & e.KeyCode & "현재줄번호 : " & _
        Me.ActiveSheet.ActiveRowIndex & " 현재열번호:" & Me.ActiveSheet.ActiveColumnIndex & " 다음줄로이동할열번호:" & Me.ANextRow_ColIndex)

        RaiseEvent Arin_Before_KeyDown(sender, e) : RaiseEvent Arin_AddLog(Me, "Before Keydown 이벤트를 발생시켰습니다.")

        Select Case e.KeyCode
            Case Keys.Enter
                e.SuppressKeyPress = False
                e.Handled = True

                If e.Control Then '//윗줄값을복사
                    RaiseEvent Arin_AddLog(Me, "keydown control 에의해 윗줄 복사")
                    Me.Cells.Value = Me.CellsPR.Value
                    '//복사하고 그자리에 멈춘다.
                Else
                    '//빈줄일때 상위값 복사하는루틴이 원ㄹ ㅐview 에 잇었으나 해당 keydown 이벤트가 이곳보다 나중에 일어나기떄문에
                    '//사용할수가없게되었다.

                    If Me.ActiveSheet.ActiveRowIndex = Me.ActiveSheet.RowCount - 1 Then '//마지막줄일경우
                        RaiseEvent Arin_AddLog(Me, "keydown 마지막줄진입 기록된다음열번호/현재열번호/전체열번호 " & Me.ANextRow_ColIndex & "/" & Me.ActiveSheet.ActiveColumnIndex & _
                          "/" & Me.ActiveSheet.ColumnCount - 1)
                        If (Me.ANextRow_ColIndex = Me.ActiveSheet.ActiveColumnIndex) OrElse (Me.ActiveSheet.ActiveColumnIndex = (Me.ActiveSheet.ColumnCount - 1)) Then '//다음줄로가아햘 경우라면
                            RaiseEvent Arin_AddLog(Me, "keydown 마지막줄이며 한줄생성해야함 " & Me.ANextRow_ColIndex & "/" & Me.ActiveSheet.ActiveColumnIndex & _
                            "마지막열번호 = " & Me.ActiveSheet.ColumnCount - 1)
                            If Not Me.v_AAutoAddrowInLast Is Nothing Then
                                Me.v_AAutoAddrowInLast.PerformClick()
                            End If
                        Else   '//마지막줄이고 다음줄이아니면 다음셀로이동
                            RaiseEvent Arin_AddLog(Me, "keydown 마지막줄이나 다음셀로 감")
                            Me.ANext_Cell()
                        End If
                    Else   '//마지막줄이아니고 마지막열이면 다음줄로
                        'MsgBox(Me.ANextRow_ColIndex & "/" & Me.ActiveSheet.ActiveColumnIndex)
                        If (Me.ANextRow_ColIndex = Me.ActiveSheet.ActiveColumnIndex) OrElse (Me.ActiveSheet.ActiveColumnIndex = (Me.ActiveSheet.ColumnCount - 1)) Then '//다음줄로가아햘 경우라면
                            RaiseEvent Arin_AddLog(Me, "keydown 마지막줄이아니며 다음줄로" & Me.ANextRow_ColIndex & "/" & Me.ActiveSheet.ActiveColumnIndex)
                            Me.ANEXT_ROW()
                        Else
                            RaiseEvent Arin_AddLog(Me, "keydown 마지막줄이아니며 다음셀로")
                            Me.ANext_Cell()
                        End If
                    End If
                    'MsgBox("한줄넘기고 마지막완료단ㄷ게")
                End If
                'If Not Me.v_AAutoAddrowInLast Is Nothing Then
                '    If Me.ActiveSheet.ActiveRowIndex = Me.ActiveSheet.RowCount - 1 Then '//마지막줄에
                '        If Me.ANextRow_ColIndex = Me.ActiveSheet.ActiveColumnIndex Then '//다음줄로가아햘 경우라면
                '            e.Handled = True
                '            Me.v_AAutoAddrowInLast.PerformClick()
                '        ElseIf Me.ActiveSheet.ActiveColumnIndex = Me.ActiveSheet.ColumnCount - 1 Then   '//마지막열이라면
                '            e.Handled = True
                '            Me.v_AAutoAddrowInLast.PerformClick()
                '        End If
                '    End If

                'End If


            Case Keys.Delete
                If e.Shift Then '//쉬프트가 눌러져잇을경우
                    If Me.V_DeleteKey Then Delete_itm(, True)
                    e.Handled = True
                Else
                    If Me.V_CurrentDel Then
                        If Not Me.ActiveSheet.ActiveCell.Locked AndAlso Not Me.ActiveSheet.ActiveColumn.Locked Then
                            Me.ActiveSheet.ActiveCell.ResetValue()
                        Else
                            Me.Disp_Msg("현재 셀은 잠겨있으므로 값을 삭제할 수 없습니다")
                        End If
                        'Me.OnEditModeOff(Nothing)
                        e.Handled = True
                    End If
                End If

            Case Keys.Space  '//편집모드
                If Me.V_SpaceEdit Then EditMode = True
                e.Handled = True
            Case Keys.F1
            Case Keys.F2
            Case Keys.F3
            Case Keys.F4
            Case Keys.F5
            Case Keys.F6
            Case Keys.F7
            Case Keys.F8
            Case Keys.F9
            Case Keys.F10
            Case Keys.F11
            Case Keys.F12
            Case 18   '//왼쪽ALT
                e.SuppressKeyPress = False
                e.Handled = True
            Case Else '//그외다른게입력되어있을경우에는 editmode 에 들어가게되므로 한글처리를 위해 바로 에디트모드로 들어오게한다.
                '//숫자가입력되면 넘어가버리므로

                If e.KeyCode >= Keys.NumPad0 AndAlso e.KeyCode <= Keys.NumPad9 Then
                    '//우측숫자패트 
                ElseIf e.KeyCode >= Keys.D0 AndAlso e.KeyCode <= Keys.D9 Then
                    '//일반숫자패드
                Else
                    If Not e.Alt AndAlso Not e.Control AndAlso Me.ImeMode = Windows.Forms.ImeMode.Hangul Then
                        EditMode = True
                    End If
                End If

        End Select
    End Sub


    ''' <summary>
    ''' 뷰의 줄 높이 변경되었을때의 반응
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub CustFP_RowHeightChanged(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.RowHeightChangedEventArgs) Handles Me.RowHeightChanged
        If Me.V_sameRHeight Then
            Dim Row As FarPoint.Win.Spread.RowHeightChangeExtents = e.RowList(0)
            Me.ActiveSheet.Rows.Default.Height = Me.ActiveSheet.Rows(Row.FirstRow).Height
        End If
    End Sub

    Public Sub Excel_Save(ByVal Filename As String, Optional ByVal INitdir As String = vbNullString, Optional ByVal Asfilter As Boolean = False)
        If Me.ActiveSheet.Rows.Count <= 0 Then
            MsgBox("내보내기할 목록이 존재하지 않습니다", MsgBoxStyle.Critical, "확인")
            Exit Sub
        End If
        Try
            Dim A As New SaveFileDialog
            A.InitialDirectory = IIf(INitdir = vbNullString, My.Application.Info.DirectoryPath, INitdir)
            A.Filter = "엑셀 워크시트파일|*.XLS"
            A.FileName = Filename
            If A.ShowDialog = Windows.Forms.DialogResult.OK Then
                ' Me.prb1.Style = ProgressBarStyle.Marquee
                If Not Asfilter Then
                    Me.SaveExcel(A.FileName, FarPoint.Excel.ExcelSaveFlags.SaveAsViewed)
                Else
                    Me.SaveExcel(A.FileName, FarPoint.Excel.ExcelSaveFlags.SaveAsFiltered)
                End If
            End If

        Catch ex As Exception
            MsgBox("내보내기실패" & vbCrLf & ex.ToString, MsgBoxStyle.Critical, "확인")

        End Try

    End Sub
    ''' <summary>
    ''' 싱글로우형식을때 표시하고자하는 DatarowView 를 보내주면 셀의 TAG를 맞춰서 표시합니다.
    ''' </summary>
    ''' <param name="Drv"></param>
    ''' <remarks></remarks>
    Public Sub ASingleRow_Viewer(ByVal Drv As DataRowView, ByVal StartRange As Point, ByVal EndRange As Point)
        For i As Integer = StartRange.Y To EndRange.Y '//범위행
            For j As Integer = StartRange.X To EndRange.X    '//범위열
                If Not Me.ActiveSheet.Cells(i, j).Tag Is Nothing Then
                    Me.ActiveSheet.Cells(i, j).Text = Drv(Me.ActiveSheet.Cells(i, j).Tag.ToString)
                End If
            Next
        Next
    End Sub
    ''' <summary>
    ''' 싱글로우형식을때 표시하고자하는 DatarowView 를 보내주면 셀의 TAG를 맞춰서 표시합니다.
    ''' </summary>
    ''' <param name="Drv"></param>
    ''' <remarks></remarks>
    Public Sub ASingleRow_Viewer(ByVal Drv As DataRowView)
        For Each RW As FarPoint.Win.Spread.Row In Me.ActiveSheet.Rows
            For Each CL As FarPoint.Win.Spread.Column In Me.ActiveSheet.Columns
                If Not Me.ActiveSheet.Cells(RW.Index, CL.Index).Tag Is Nothing Then
                    If Drv(Me.ActiveSheet.Cells(RW.Index, CL.Index).Tag.ToString) Is DBNull.Value Then
                        Me.ActiveSheet.Cells(RW.Index, CL.Index).Value = ""
                    Else
                        Me.ActiveSheet.Cells(RW.Index, CL.Index).Value = Drv(Me.ActiveSheet.Cells(RW.Index, CL.Index).Tag.ToString)
                    End If

                End If
            Next
        Next
    End Sub

    ''' <summary>
    ''' 싱글로우형식을 사용할때 스프레드값을 데이터테이블에 보낸다.
    ''' </summary>
    ''' <param name="Drv"></param>
    ''' <remarks></remarks>
    Public Sub ASingleRow_Writer(ByRef Drv As DataRowView)
        If Not Me.ActiveSheet.ActiveCell.Tag Is Nothing Then
            'MsgBox(Me.ActiveSheet.ActiveCell.Text)
            Drv(Me.ActiveSheet.ActiveCell.Tag.ToString) = Me.ActiveSheet.ActiveCell.Value
        End If
    End Sub

    Public Sub New()

        ' 이 호출은 Windows Form 디자이너에 필요합니다.
        InitializeComponent()

        ' InitializeComponent() 호출 뒤에 초기화 코드를 추가하십시오.

    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub
End Class
