참고 : https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listview(v=vs.110).aspx
https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listviewitem(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.listview.columns(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.windows.forms.columnheader(v=vs.110).aspx --> ColumnHeader Class
1. 기본 설정하기
ListView.View ; 화면 설정
(https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listview.view(v=vs.110).aspx)
--- Details, List, Tile, LargeIcon, SmallIcon 중의 하나
ListView.GridLines ; 구분선 표시 설정
(https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listview.gridlines(v=vs.110).aspx)
ListView.FullRowSelect ; 한줄씩 선택 설정
(https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listview.fullrowselect(v=vs.110).aspx)
ListView.CheckBoxes ; 체크박스 표시하기
(https://msdn.microsoft.com/ko-kr/library/system.windows.forms.listview.checkboxes(v=vs.110).aspx)
2. Column 추가, 삭제
3. data 추가하기
1) item 추가하기
2) subitem 추가하기
4. 기본 정보 출력하기
5. 선택한 행 삭제하기 ; 방법 1
선택한 행 삭제하기 ; 방법 2
6. checked 행 삭제하기 ; 방법 1
checked 행 삭제하기 ; 방법 2
7. 색상 변경
8. 마우스 Right click 한곳의 item 찾기.
9. ListView.HitTest() 사용하여, 마우스 click 위치 구하여, item, subitem 찾기
<< 전체 소스 보기 >>
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace ListView_test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
listView1.View = View.Details;
listView1.GridLines = true;
listView1.FullRowSelect = true;
listView1.CheckBoxes = true;
// listView1.LabelEdit = true;
listView1.Columns.Add("a", 100);
listView1.Columns.Add("b");
listView1.Columns.Add("c", 50, HorizontalAlignment.Right);
listView1.Columns.Add("d", 50, HorizontalAlignment.Center);
/*
// String[] aa = {"aa1", "aa2"}; 와 같이 일부 항목만 입력해도 ListView 에 표시되지만,
// 나중에 item.SubItems[index].Text 로 나중에 접근시 ArgumentOutOfRangeException 발생한다.
// 모두 입력하는게 좋다.
*/
String[] aa = {"aa1", "aa2", "", "" };
ListViewItem newitem = new ListViewItem(aa);
listView1.Items.Add(newitem);
newitem = new ListViewItem(new String[] { "bb1", "bb2", "bb3", ""});
listView1.Items.Add(newitem);
}
// ListViewItem 추가하기
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
ListViewItem item;
if (i % 2 == 0)
{
item = new ListViewItem(); // 첫칸 빈칸 입력
}
else
{
item = new ListViewItem("첫칸");
}
item.SubItems.Add(i.ToString());
item.SubItems.Add(""); // 첫칸과 달리, 빈칸 입력시 "" 필수.
item.SubItems.Add(i.ToString());
listView1.Items.Add(item);
}
}
// 체크박스 toggle
private void button2_Click(object sender, EventArgs e)
{
// listView1.CheckBoxes = false; // default 설정.
listView1.CheckBoxes = !listView1.CheckBoxes;
foreach (ListViewItem item in listView1.Items)
{
if (item.Checked)
{
Console.WriteLine(" cheched row index = {0}, {1}", item.Index, item.SubItems[0].Text);
}
}
}
// Column 추가 삭제 반복
private void button3_Click(object sender, EventArgs e)
{
String msg = String.Format("칼럼수 == {0}", listView1.Columns.Count);
Console.WriteLine(msg);
if (listView1.Columns.Count == 4)
{
listView1.Columns.RemoveAt(3);
}
else
{
listView1.Columns.Add("추가 컬럼");
listView1.Columns.Add("추가 컬럼2", 150, HorizontalAlignment.Center);
listView1.Columns.Insert(2, "insert컬럼"); // index 2 번 자리에 column 추가.
}
}
// 기본정보 및 내용 출력하기
private void button4_Click(object sender, EventArgs e)
{
Console.WriteLine("총 row 수 = {0}", listView1.Items.Count);
Console.WriteLine("총 column 수 = {0}", listView1.Columns.Count);
//각 행의 subitem 갯수는 컬럼수와 동일
Console.WriteLine(" 2번째 행의 subitem 갯수 = {0}", listView1.Items[1].SubItems.Count);
Console.WriteLine(" 2번째 행, 3번째 subitem 내용 = {0}", listView1.Items[1].SubItems[2].Text);
Console.WriteLine(" --------------------------------");
ListView.ColumnHeaderCollection colheaderColl = listView1.Columns;
foreach (ColumnHeader colHeader in colheaderColl)
{
Console.WriteLine("ColumnHeader Name = {0} ; Text = {1}", colHeader.Name, colHeader.Text);
}
Console.WriteLine("3번째 칼럼 제목 = {0}", colheaderColl[2].Text);
}
// 선택한 행 정보얻기 및 삭제 (selected row ) ; 방법 1
private void button5_Click(object sender, EventArgs e)
{
var idxColl = listView1.SelectedIndices; // 선택된 줄들의 모음 반환
Console.WriteLine("선택된 rows count == {0}", idxColl.Count);
// index 기준 삭제시에는 역순으로 삭제해야함.
for (int i = idxColl.Count - 1; i >= 0; i--)
{
int idx = idxColl[i];
listView1.Items[idx].Remove(); // listView1.Items.RemoveAt(idx);
Console.WriteLine("{0} 번째 row 삭제됨", idx);
}
}
// 선택한 행 정보얻기 및 삭제 (selected row ) ; 방법 2
private void button6_Click(object sender, EventArgs e)
{
ListView.SelectedListViewItemCollection itemColl = listView1.SelectedItems;
foreach (ListViewItem item in itemColl)
{
Console.WriteLine("선택한 row 의 첫 컬럼 내용 == {0}", item.Text);
// index 는 가변적임 (row 삭제시마다 바뀜) --> 그냥 index 기준으로 삭제하면 안됨.
Console.WriteLine("선택한 row index = {0}", item.Index);
// item 의 모든 subitem 출력
for (int i = 0; i < listView1.Columns.Count; i++)
{
Console.WriteLine("선택된 row 의 {0}번째 subitem 내용 == {1}", i, item.SubItems[i].Text);
}
listView1.Items.Remove(item);
}
}
// checked 행 삭제 방법 1
private void button7_Click(object sender, EventArgs e)
{
Console.WriteLine(" cheched row 총 수 = {0}", listView1.CheckedIndices.Count);
// index 역순으로 삭제해야함...
for (int i = listView1.CheckedIndices.Count - 1 ; i >= 0; i--)
{
int idx = listView1.CheckedIndices[i];
Console.WriteLine("삭제되는 checked row index = {0}", idx );
listView1.Items.RemoveAt(idx); // listView1.Items[idx].Remove();
}
}
// checked 행 삭제 방법 2
private void button8_Click(object sender, EventArgs e)
{
Console.WriteLine(" cheched row 총 수 = {0}", listView1.CheckedItems.Count);
foreach (ListViewItem item in listView1.CheckedItems)
{
// row 삭제되면서 index 계속 바뀜. -- item 기준으로 삭제해야 정확히 삭제됨.
Console.WriteLine("삭제되는 checked row index = {0}", item.Index);
listView1.Items.Remove(item);
}
}
// 배경색 변경
private void button9_Click(object sender, EventArgs e)
{
foreach (ListViewItem item in listView1.Items)
{
if (item.Index % 2 == 0)
{
item.BackColor = Color.Yellow; // new Color();
}
else
{
item.ForeColor = Color.Red;
// UseItemStyleForSubItems = true ; default
item.UseItemStyleForSubItems = false; // subitem 각각에 Font, Color 지정가능.
item.SubItems[0].ForeColor = Color.Blue;
item.SubItems[1].BackColor = Color.Cyan;
}
}
}
// ContextMenuStrip
private void button10_Click(object sender, EventArgs e)
{
//this.components = new System.ComponentModel.Container();
//this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
}
// ContextMenuStrip 에서 foreground color 선택한 경우...
private void foregroundColorToolStripMenuItem_Click(object sender, EventArgs e)
{
// Console.WriteLine(MousePosition.X);
// contextmenustrip 오픈위해 Right click 하는 순간, 해당 row 가 selected 됨.
// 여러개 selected 한후, selected 영역내에서 Right click 시에도 적용가능..
foreach (ListViewItem item in listView1.SelectedItems)
{
item.UseItemStyleForSubItems = false;
item.SubItems[1].ForeColor = Color.Red;
item.SubItems[1].Font = new Font("Fixsys", 10, FontStyle.Bold);
}
}
// listview1 의 데이터 입력 영역의 Mouse click event 만 처리한다.*************
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
Console.WriteLine("x= {0}, y= {1}", e.X, e.Y);
Console.WriteLine("PointToScreen(e.Location) = {0}", PointToScreen(e.Location));
// mouse 위치 2 차이나는 이유 모르겠음.?????
Console.WriteLine("MousePosition.X = {0}, MousePosition.Y = {1}", MousePosition.X, MousePosition.Y);
Console.WriteLine("PointToClient(MousePosition) = {0}", PointToClient(MousePosition));
Console.WriteLine("---------------------------");
if (e.Button == MouseButtons.Right)
{
Console.WriteLine(e.Location.ToString());
Console.WriteLine("x= {0}, y= {1}", e.X, e.Y);
Console.WriteLine("PointToScreen(e.Location) = {0}", PointToScreen(e.Location));
ListViewItem clickedItem = listView1.GetItemAt(e.X, e.Y);
Console.WriteLine(clickedItem.Index);
}
}
// MousePosition --> screen 좌표
private void listView1_Click(object sender, EventArgs e)
{
Console.WriteLine("---------------------------");
Console.WriteLine("MousePosition.X = {0}, MousePosition.Y = {1}", MousePosition.X, MousePosition.Y);
Console.WriteLine("PointToClient(MousePosition) = {0}", PointToClient(MousePosition));
Console.WriteLine("Form location == {0}", this.Location);
Console.WriteLine("listview1 location = {0}", listView1.Location);
Console.WriteLine("---------------------------");
}
// contextmenustrip 클릭한 위치의 item, subitem 구하기
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
Point ptInListView = PointToClient(MousePosition);
// ListViewItem item = listView1.GetItemAt(ptInListView.X, ptInListView.Y);
ListViewHitTestInfo hitInfo = listView1.HitTest(ptInListView.X, ptInListView.Y);
// HitTest 부분이 listview 의 item 영역이 아니면, ListViewHitTestInfo.Item = null 이다.
if (hitInfo.Item != null)
{
Console.WriteLine("hittest subitem index == {0}", hitInfo.Item.SubItems.IndexOf(hitInfo.SubItem));
}
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
Console.WriteLine(" -------------db click =============");
}
}
}
'개발언어 > C#' 카테고리의 다른 글
[C#] listview에 button추가시 샘플1 (0) | 2021.08.10 |
---|---|
[C#] 버튼 button의 값넣기 Tag (0) | 2021.08.10 |
[NAudio] 7. Visualization (0) | 2021.07.08 |
[C#] 예외 처리 (throw/ finally) (0) | 2021.07.01 |
[C#] Exception 예외 처리 (try-catch-finally, throw) (0) | 2021.07.01 |