C#.NET Q&A

TreeView 만드는데 있어서 조언 좀 구하고자 합니다.. 악마성 평점: 없음 조회: 166
언어는 VB.NET 이지만 방식이 도저히 떠오르지 않아서 이렇게 여기에 문의 드리는 점 죄송합니다..


아래 처럼 트리를 제품명이 1레벨, 제조사 2레벨, 모델명 3레벨, 시리얼 4레벨로 구현하고 싶은데

현재는
dt.rows(i).item(0).toString()  는 루트노드
dt.rows(i).item(1).toString()  는 자식노드
dt.rows(i).item(2).toString() 는 자식의 자식노드
dt.rows(i).item(3).toString() .... 형식으로 

노드가 있는지 찾아서 없으면 붙이는 형식으로 하고 있습니다..
이게 지금은 제품명부터 해서 4레벨인데 dt의 컬럼이 7~9개가 될 수도 있는데 
그렇게 되면 .. 코드가 엄청 길어질 거 같아서 이것저것 찾아보는데 .. 방법 조언좀 듣고 싶습니다..




   Public Sub BuildTree(ByVal expandAll As [Boolean])
        ' Clear the TreeView if there are another datas in this TreeView
        TreeView.Nodes.Clear()
        Dim node As System.Windows.Forms.TreeNode
        Dim keyNode As System.Windows.Forms.TreeNode
        Dim subNode As System.Windows.Forms.TreeNode
        For Each row As DataRow In _dt_tables.Rows
            'search in the treeview if any country is already present
            node = Searchnode(row.Item(0).ToString(), TreeView)
 
            If node IsNot Nothing Then
                keyNode = Searchnode_key(row.Item(1).ToString(), node)
                If keyNode IsNot Nothing Then
                    'Country is already present
                    subNode = New System.Windows.Forms.TreeNode(row.Item(2).ToString())
                    keyNode.Nodes.Add(subNode)
                Else
                    'Country is already present
                    subNode = New System.Windows.Forms.TreeNode(row.Item(2).ToString())
                    If row.Item(3).ToString() = "" Then
                        'keyNode = New TreeNode(row.Item(4).ToString())
                        node.Nodes.Add(subNode)
                    Else
                        keyNode = New System.Windows.Forms.TreeNode(row.Item(1).ToString())
                        keyNode.Nodes.Add(subNode)
                        node.Nodes.Add(keyNode)
                    End If
 
                End If
            Else
                node = New System.Windows.Forms.TreeNode(row.Item(0).ToString())
                subNode = New System.Windows.Forms.TreeNode(row.Item(2).ToString())
                If row.Item(3).ToString() = "" Then
                    'keyNode = New TreeNode(row.Item(4).ToString())
                    ' keyNode.Nodes.Add(subNode)
                    node.Nodes.Add(subNode)
                    TreeView.Nodes.Add(node)
                Else
                    keyNode = New System.Windows.Forms.TreeNode(row.Item(1).ToString())
                    keyNode.Nodes.Add(subNode)
                    node.Nodes.Add(keyNode)
                    TreeView.Nodes.Add(node)
                End If
 
            End If
        Next
        If expandAll Then
            ' Expand the TreeView
            TreeView.ExpandAll()
        End If
    End Sub
 
    '해당 노드가 있는지 확인 함
    Private Function Searchnode(ByVal nodetext As String, ByVal trv As System.Windows.Forms.TreeView) As System.Windows.Forms.TreeNode
        For Each node As System.Windows.Forms.TreeNode In trv.Nodes
            If node.Text = nodetext Then
                Return node
            End If
        Next
    End Function
    '해당 노드가 있는지 확인 함
    Private Function Searchnode_key(ByVal nodetext As String, ByVal node As System.Windows.Forms.TreeNode) As System.Windows.Forms.TreeNode
        For Each keyNode As System.Windows.Forms.TreeNode In node.Nodes
            If keyNode.Text = nodetext Then
                '일치하는 노드가 있을 시 반환
                Return keyNode
            End If
        Next
    End Function


태그 : treeview질문
작성자 정보
악마성
Level 6
 [EXP.12/14]

메일:  비공개

글등록 +12 48 덧글등록 +3 12
자기소개
안뇽하세요~ VB.NET을 위주로 하고 있는 사람 입니다.
글 공유하기 |
  tweet facebook
2019-03-04 오후 1:05:52
나도한마디
사용자
한가람1            [2019-03-07]
Level 25
 [EXP.16/50]
foreach (DataRow dr in dt.Rows)
{
CreateTreeList(dr, treeview);
}


void CreateTreeList(DataRow dr, System.Windows.Forms.TreeView tv)
{
System.Windows.Forms.TreeNode tnPre = null;
foreach (DataColumn dc in dr.Table.Columns)
{
TreeNode tnFind = null;
string strText = dr[dc].ToString();
switch (dr.Table.Columns.IndexOf(dc))
{
case 0:
tnFind = tv.Nodes.Find(strText, false).DefaultIfEmpty().First();
break;
default:
tnFind = tnPre.Nodes.Find(strText, false).DefaultIfEmpty().First();
break;
}
if (tnFind == null)
{
if (tnPre == null) tnFind = tv.Nodes.Add(strText);
else tnFind = tnPre.Nodes.Add(strText);
}
tnPre = tnFind;
}
}

대충 이렇게 가면 될거 같네요.
사용자
악마성            [2019-03-12]
Level 6
 [EXP.12/14]
답변 너무 감사합니다! 참고해서 해보도록 하겠습니다 !
태그로 엮인글
글리스트
윈폼에서 쪽지기능 구현방법에 대해 질문드립니다.[2]+3  ofone
.NET Web API 서버 호출 시 DateTime 파라미터 값이 API 에서 변경 됩니다.[1]+1  애기곰
c#에서 spread cell에서 물어볼께 있습니다...  바밤바
C# 서버 질문드립니다![2]+2  코딩아비
프로시져 두번호출 관련문의....[2]  닷지
C# 프로그램과 카카오톡 간 오류[2]  ejqkfmrp
멀티코어링? 멀티스레딩? 질문입니다.[1]+1  왕초보자
C# 폴더생성 문제[4]  훈쓰쓰훈
C# 윈폼으로 개발된 앱에 pg사의 결제모듈을 붙일 수 있는 방법이 있을까요?[1]+1  ofone
C# 윈폼 - 일정하지 않은 시간에 따른 데이터 처리에 관하여 질문합니다.[1]+1  프린이
 ★현재글->   TreeView 만드는데 있어서 조언 좀 구하고자 합니다..[1]+1  악마성
c# webbrowser 첫 페이지만 로딩이 느린이유??  penmouse
윈폼 Datagridview 에서 엑박(redbox) 나는 이유가 뭘까요... [2]+2  밍님
웹폼 텍스트박스에서 TextMode에서 Password에 값넣기  비베씨샾
[RE] 웹폼 텍스트박스에서 TextMode에서 Password에 값넣기  아르디스
pcm 데이타를 플레이시키려면 어떻게하면되나요?[1]  엿장수
delegate event 사용 방법에 대해 질문드립니다.[1]  개발초보초보
foreach 문을 for 문으로 변경하고 싶습니다.[1]  insurang
특정 문자에 대해 처리하는 좋은 방법이 있을까요?[2]+1  꾸레이
c# split, Join 질문드리빈다~[5]+3  키쿄쿄쿄키쿗
소스코드 내에 있는 DB 접속정보를 보호할 방법이 있을까요? [2]+2  ofone