프로그래밍/C#_시트 프로그램

[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (3)

사과맛츄르 2024. 11. 20. 22:51
반응형

카테고리 제거

카테고리를 제거하는건 앞서 설계했었다.

  • 카테고리 제거 시 경고 메시지를 띄운다.
  • 상위 카테고리는 하위 카테고리가 있다면, 제거할 수 없다.
  • 카테고리를 제거하면, 실제로 다룰 데이터는 소속된 카테고리를 잃어버린다.
  • 보이지 않는 곳에 빈 카테고리를 넣어두고 카테고리 제거 시 다음 중 하나의 동작을 한다.
    1. 카테고리 내 데이터를 일괄적으로 특정 카테고리로 옮긴다.
    2. 카테고리 내 데이터를 일괄적으로 빈 카테고리로 옮긴다.
    3. 카테고리 내 데이터를 일괄적으로 제거한다.

우선 이중 현재 데이터가 없어 테스트를 할 수 없는 두 가지는 일단 넘어가고, 위에 두 가지부터 진행해보자.

버튼을 누르면 메시지를 띄우고 확인 시 해당 카테고리를 제거하는 기능을 넣자.

private void btnDelete_Click(object sender, EventArgs e)
{
    if(!this._isSubCategory)
    {
        if(this._listSubCategory.Count > 0)
        {
            MessageBox.Show("하위 카테고리가 있는 카테고리는 제거할 수 없습니다.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            return;
        }
    }
    DialogResult result = MessageBox.Show("카테고리를 제거하시겠습니까?", "카테고리 제거", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
    if(result == DialogResult.Yes)
    {
        isRemoved = true;
        if (_mainCategory != null)
            _mainCategory.Invoke(new MethodInvoker(delegate { _mainCategory.removeSubCategory(); }));
        else if ((_mainCategory == null) && (_mainForm != null))
            _mainForm.Invoke(new MethodInvoker(delegate { _mainForm.removeMainCategory(); }));
    }
}

확인 버튼을 누르면 제거하는 기능을 넣었다.

단순히 제거하는게 문제가 아니라 제거된 뒤가 문제다.

제거된 뒤, 그래픽 처리를 해야하기 때문이다.

그걸 위해서 invoke를 이용해 상위 form의 그림을 크로스스레드로 그릴 수 있도록 한다.

우선 자신의 하위 카테고리를 제거할 경우 이벤트가 발생하기 위해서 다음과 같은 함수를 추가한다.

public void removeSubCategory()
{
    int h = 0;
    objCategory _deletedCategory = null;
    foreach(objCategory obj in _listSubCategory)
    {
        if(obj.isRemoved)
        {
            _deletedCategory = obj;
            continue;
        }
        obj.Location = new System.Drawing.Point(0, h);
        h += obj.Height;
    }

    _listSubCategory.Remove(_deletedCategory);
    _deletedCategory.Dispose();

    Height = _showSubClass ? (_listSubCategory.Count + 1) * _minHeight : _minHeight;

    _mainForm.redrawPnlCategories();
}

메인 카테고리 제거

앞서 함수에도 추가되었지만, 메시지가 추가되어있다.

앞선 코드에 기반하여 하위카테고리가 있으면 제거할 수 없다. 하지만, 하위 카테고리가 없다면? 제거가 가능하다!

이 부분 역시 제거되었을 경우 별개의 그림을 그리는 부분이 필요하다...

사실 이걸 이벤트로 처리해도 될 것 같은데 1년동안 C#을 안하다보니...까먹은게 큰데 가장 간단한 방법을 찾아왔다.

public void removeMainCategory()
{
    objCategory _deletedCategory = null;
    foreach (objCategory obj in _categories)
    {
        if (obj.isRemoved)
        {
            _deletedCategory = obj;
            break;
        }
    }

    _categories.Remove(_deletedCategory);
    _deletedCategory.Dispose();

    this.redrawPnlCategories();
}

결국 카테고리 관리는 TreeNode

결국 이 데이터는 TreeNode로 관리가 되어야 한다. 

이미 List형태로 해당 컴포넌트를 관리하고있기 때문에 사실상 TreeNode형으로 받을 수 있기만 하면된다.

이름을 제외하면 별 특징이 없기 때문이다.

해당 Form을 닫으면 이 Node를 반환받을 수 있다!

public TreeNode Node { get
    {
        TreeNode node = new TreeNode("root");
        foreach(objCategory obj in _categories)
        {
            TreeNode mainCategory = new TreeNode(obj.categoryName);
            foreach(objCategory subObj in obj._listSubCategory)
                mainCategory.Nodes.Add(new TreeNode(subObj.categoryName));
            node.Nodes.Add(mainCategory);
        }
        return node;
    } }

그렇다면, 이제 이 TreeNode를 매개변수로 넣어서 처음부터 카테고리가 있게 시작할 수 있다!

만들고, 닫은다음 다시 열면? 그대로 남아있다!

public TreeNode Node { 
    get {
        TreeNode rootNode = new TreeNode("root");
        foreach(objCategory obj in _categories)
        {
            TreeNode mainCategory = new TreeNode(obj.categoryName);
            foreach(objCategory subObj in obj._listSubCategory)
                mainCategory.Nodes.Add(new TreeNode(subObj.categoryName));
            rootNode.Nodes.Add(mainCategory);
        }
        return rootNode;
    }
    set {
        TreeNode rootNode = value;

        int pnlHeight = 0;
        foreach(TreeNode mainNode in rootNode.Nodes)
        {
            objCategory mainCategory = new objCategory(mainNode.Text, this);
            mainCategory.Anchor = AnchorStyles.Top;
            mainCategory.Location = new Point(0, pnlHeight);
            foreach (TreeNode subNode in mainNode.Nodes)
            {
                objCategory subCategory = new objCategory(subNode.Text, isSubCategory:true, mainCategory:mainCategory);
                mainCategory._listSubCategory.Add(subCategory);
            }
            mainCategory.setPanel();
            _categories.Add(mainCategory);
            pnlCategories.Controls.Add(mainCategory);
            pnlHeight += mainCategory.Height;
        }
        pnlCategories.Height = pnlHeight;

    }
}

대략적인 카테고리 관리를 추가 완료했다. 이제 만든 카테고리를 db에 저장하여 관리하는 부분을 추가해야한다.


나만의 카테고리 다이얼로그 (2)

 

[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (2)

카테고리 이름 초기화우선 초기 이름이 Empty인 것은 조금 아쉬우니 개수만큼 번호를 매기도록 해보자.namespace AppleSheet.menuCategoryEdit{ public partial class objCategory : UserControl { private string _name = string.Emp

apple-churr.tistory.com

나만의 카테고리 다이얼로그 (4)

 

[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (4)

SQLite를 설치해보자!간단하게 로컬에서 데이터를 관리하고자 한다면, SQLite가 간단한 것 같다.VisualStudio에서 C#을 개발할 때 SQLite를 쓰려면 다음과 같은 절차를 따른다.프로젝트를 오른쪽 클릭을

apple-churr.tistory.com

 

반응형