카테고리 제거
카테고리를 제거하는건 앞서 설계했었다.
- 카테고리 제거 시 경고 메시지를 띄운다.
- 상위 카테고리는 하위 카테고리가 있다면, 제거할 수 없다.
- 카테고리를 제거하면, 실제로 다룰 데이터는 소속된 카테고리를 잃어버린다.
- 보이지 않는 곳에 빈 카테고리를 넣어두고 카테고리 제거 시 다음 중 하나의 동작을 한다.
- 카테고리 내 데이터를 일괄적으로 특정 카테고리로 옮긴다.
- 카테고리 내 데이터를 일괄적으로 빈 카테고리로 옮긴다.
- 카테고리 내 데이터를 일괄적으로 제거한다.
우선 이중 현재 데이터가 없어 테스트를 할 수 없는 두 가지는 일단 넘어가고, 위에 두 가지부터 진행해보자.
버튼을 누르면 메시지를 띄우고 확인 시 해당 카테고리를 제거하는 기능을 넣자.
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형으로 받을 수 있기만 하면된다.
이름을 제외하면 별 특징이 없기 때문이다.
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
'프로그래밍 > C#_시트 프로그램' 카테고리의 다른 글
[C#_시트 프로그램] 데이터를 입력해보자. (1) (0) | 2024.11.26 |
---|---|
[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (4) (0) | 2024.11.21 |
[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (2) (1) | 2024.11.19 |
[C#_시트 프로그램] 나만의 카테고리 다이얼로그 (1) (0) | 2024.11.18 |
[C#_시트 프로그램] UI 초기 구상 (0) | 2024.11.16 |