728x90

텍스트 파일을 읽어서 ListView 에 뿌리는 예제 코드다.

텍스트 파일의 인코딩 방식은 default 방식인 ANSI 이고, listView 를 직접 선택할 수 있게 코드를 작성했다.

파일을 Line 단위로 읽어서

Split 구분자로 칼럼 구분을 하고, 칼럼 구분된 배열 요소를 ListView 에 저장한다.


private void getTextFile_Click(object sender, EventArgs e)
{
    using (OpenFileDialog dlg = new OpenFileDialog())
    {
        dlg.Filter = "TextFile (*.txt) | *.txt";
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            TextFileRead(dlg.FileName, listView1);
        }
    }
}

public void TextFileRead(string fileName, ListView LV)
{
    string delimiter = "/";  // 구분자
    using (var sr = new StreamReader(fileName, System.Text.Encoding.Default, true))
    {
        string line = null;
        LV.Items.Clear();  // 데이터 초기화
        while ((line = sr.ReadLine()) != null)
        {
            string[] columns = line.Split(new string[] { delimiter }, StringSplitOptions.None);

            ListViewItem lvt = new ListViewItem(columns[0]);
            lvt.SubItems.Add(columns[1]);
            lvt.SubItems.Add(columns[2]);
            LV.Items.Add(lvt);
        }
        sr.Close();
    }
}


칼럼의 갯수를 동적으로 하고자 한다면

ListViewItem lvt = new ListViewItem(columns[0]);
for (int col = 1; col < columns.Length; col++)
{
    lvt.SubItems.Add(columns[col]);
}
LV.Items.Add(lvt);
로 코드를 변경해주면 된다.


블로그 이미지

Link2Me

,
728x90

listView 에서 선택된 행과 이전행/다음행의 값을 서로 맞바꾸는 코드이다.

선택된 행도 같이 변경되게 처리했다.


private void lineSwapPreviousToolStripMenuItem_Click(object sender, EventArgs e)
{
    listView_previousSwap(listView1);
}

private void lineSwapNextToolStripMenuItem_Click(object sender, EventArgs e)
{
    listView_nextSwap(listView1);
}

private void listView_previousSwap(ListView LV)
{
    if (LV.SelectedIndices.Count > 0 && LV.SelectedItems[0].Index > 0)
    {
        int index = LV.SelectedItems[0].Index;  // 선택된 행의 인덱스
        int previousindex = index - 1; // 이전행의 인덱스

        string temp2 = LV.Items[index].SubItems[2].Text;  // 선택된 행의 값을 임시변수에 저장
        LV.Items[index].SubItems[2].Text = LV.Items[previousindex].SubItems[2].Text;
        LV.Items[previousindex].SubItems[2].Text = temp2;

        string temp3 = LV.Items[index].SubItems[3].Text;
        LV.Items[index].SubItems[3].Text = LV.Items[previousindex].SubItems[3].Text;
        LV.Items[previousindex].SubItems[3].Text = temp3;

        string temp4 = LV.Items[index].SubItems[4].Text;
        LV.Items[index].SubItems[4].Text = LV.Items[previousindex].SubItems[4].Text;
        LV.Items[previousindex].SubItems[4].Text = temp4;


        listView_FocusedLine(LV, previousindex);

    }
}

private void listView_nextSwap(ListView LV)
{
    if (LV.SelectedIndices.Count > 0 && LV.SelectedItems[0].Index < LV.Items.Count -1)
    {
        int index = LV.SelectedItems[0].Index;  // 선택된 행의 인덱스
        int nextindex = index + 1; // 다음행의 인덱스

        string temp2 = LV.Items[index].SubItems[2].Text;  // 선택된 행의 값을 임시변수에 저장
        LV.Items[index].SubItems[2].Text = LV.Items[nextindex].SubItems[2].Text;
        LV.Items[nextindex].SubItems[2].Text = temp2;

        string temp3 = LV.Items[index].SubItems[3].Text;
        LV.Items[index].SubItems[3].Text = LV.Items[nextindex].SubItems[3].Text;
        LV.Items[nextindex].SubItems[3].Text = temp3;

        string temp4 = LV.Items[index].SubItems[4].Text;
        LV.Items[index].SubItems[4].Text = LV.Items[nextindex].SubItems[4].Text;
        LV.Items[nextindex].SubItems[4].Text = temp4;


        listView_FocusedLine(LV, nextindex);

    }
}


private void listView_FocusedLine(ListView LV, int index)
{
    if (index < 0 || index >= LV.Items.Count || LV.Items.Count == 0) return;
    LV.SelectedItems.Clear();
    LV.Items[index].Selected = true;
    LV.Items[index].EnsureVisible();
    LV.Items[index].Focused = true;
    LV.Focus();
}


블로그 이미지

Link2Me

,
728x90

응용 프로그램의 크기를 마우스로 변경할 때 C# listView 에서 칼럼 사이즈가 자동으로 변경되게 하는 방법을 알아냈다.

화면을 변경하면 칼럼 사이즈가 변경되지 않아서 좀 눈에 거슬렸었다.

"닷넷프로그래밍 정복" 책을 처음에 볼 때에는 무슨 말인지 이해를 못한 부분이 많았는데, 지금 필요한 부분을 훑어보면서 이벤트 부분을 보다보니 Resize 이벤트가 눈에 띄었다.

Resize : 폼의 크기가 변경될 때

폼의 크기가 변경되는 이벤트를 이용하면 되겠다 싶어서 해봤더니 원하는 결과가 된다.


먼저 listView1 의 이벤트 아이콘을 찾아서 Resize 에서 마우스 더블클릭을 하면 이벤트 코드가 자동으로 추가된다.


아래 메서드(함수)를 추가해주면 된다.

원하는 부분이 마지막 칼럼의 크기를 창의 크기에 맞게 최대로 나오도록 하기 위한 것이다.


private void listView_ColumnSizeAutoChange(ListView LV)
{
    LV.Columns[LV.Columns.Count - 1].Width = -2;
}

private void listView1_Resize(object sender, EventArgs e)
{
    listView_ColumnSizeAutoChange((ListView)sender);
}

private void listView2_Resize(object sender, EventArgs e)
{
    listView_ColumnSizeAutoChange((ListView)sender);
}


블로그 이미지

Link2Me

,
728x90

listView 와 textBox 을 연동하여 textBox 에서 값이 변화하면 자동으로 listView 의 해당 Line 에 변경이 발생하도록 처리하려고 했는데, 로직을 잘못 생각하여 버그가 계속 발생하는 원인을 못찾다가 겨우 해결했다.

코드를 작성할 때 Focused 가 되었을 경우에만 해당 이벤트가 발생하도록 코드를 해야한다는 걸 알아냈다.

구글링 검색해서 그런 부분까지 자세히 설명이 안되어 있다보니 오류가 발생했다.

물론 구글에 나오는 자료는 자료가 발생하는 상황이 단순한 상황이라 답변해주는 코드가 정답일 수도 있다.

하지만 내가 작성하는 코드는 다른 부분까지 엮여있어서인지 문제가 발생했고, 이 문제는 심각한 문제로 이어졌다.

물론 textBox_TextChanged 이벤트 이용을 포기하면 간단하게 해결될 수 있다. 하지만 이용자의 편의성 측면에서 매우 불편해진다.


C# listView 에서 포커스가 되지 않도록 처리하는 방법

if (listView1.SelectedItems.Count != 0)
{
    listView1.SelectedItems[0].Selected = false;
}
를 해당 이벤트에 추가해주면 된다.


listView 와 연계된 텍스트박스에서 포커스 처리하는 방법

텍스트박스에서 Alt + 화살표 방향키를 누르면 listView 선택된 행이 위아래로 변경되면서 변경된 값을 텍스트박스에 자동연동하여 처리하는 코드이다.


private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Alt && e.KeyCode == Keys.Down)  // Alt + 아래방향화살표키를 누르면
    {
        int index = listView1.FocusedItem.Index;
        listView_FocusedLIneChange(listView1, index + 1);
    }
    if (e.Alt && e.KeyCode == Keys.Up)  // Alt + 윗방향화살표키를 누르면
    {
        int index = listView1.FocusedItem.Index;
        listView_FocusedLineChange(listView1, index - 1);
    }
}

private void listView_FocusedLineChange(ListView LV, int index)
{
    if (index < 0 || index >= LV.Items.Count || LV.Items.Count == 0) return;
    LV.SelectedItems.Clear();
    LV.Items[index].Selected = true;
    LV.Items[index].EnsureVisible();
    LV.Items[index].Focused = true;
    LV.Focus();
    listView_Focused();  // User Make 함수
    LV.Items[index].BackColor = SystemColors.Highlight;
    if (LV == listView1)
    {
        textBox1.Focus();
        textBox1.SelectionStart = textBox1.Text.Length; // 마지막을 선택
        textBox1.ScrollToCaret(); // 선택된 위치에 스크롤을 움직인다
    }
    else if (LV == listView2)
    {
        textBox2.Focus();
        textBox2.SelectionStart = textBox2.Text.Length;
        textBox2.ScrollToCaret();
    }
}


블로그 이미지

Link2Me

,
728x90

C# listView 에서 칼럼 너비를 지정하는 방법이다.

사용법이 미숙해서인지 테스트를 하다보면 원하지 않는 결과가 나와서 당황스러워 적어둔다.


listView1.Columns[3].Width = 0;  // 칼럼을 보이지 않게 처리
listView1.Columns[1].Width = -2; //Text Column Header 셀 자동 크기
listView1.Columns[1].Width = 679;


listView1.Columns[1].Width = -2; 로 지정하면, 해당 칼럼의 Text 길이에 따라 가변적으로 변한다.

길이가 변하지 않고 고정적으로 하고 싶다면, 숫자를 직접 지정해준다.


Header 칼럼의 사이즈를 임의로 조정하지 못하게 하는 방법은

ListView.ColumnWidthChanging 이벤트(열 너비가 변경되고 있을 때 발생)를 이용한다.


마우스 더블클릭하여 생성된 코드에다가 아래와 같이 내용을 추가한다.

private void listView1_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
{
    e.NewWidth = listView1.Columns[e.ColumnIndex].Width;
    e.Cancel = true;
}


블로그 이미지

Link2Me

,
728x90

listView 에서 행단위로 데이터를 삭제하고자 할 경우, Drag & Drop 으로 파일을 읽어들일 경우, 칼럼 하나를 보이지 않게 처리하고 싶은 경우의 코드이다.



private void cmLV1_Delete_Click(object sender, EventArgs e)
{
    DialogResult comfirm = MessageBox.Show("정말로 삭제하시겠습니까?", "데이터삭제", MessageBoxButtons.YesNo);
    switch (comfirm)
    {
        case DialogResult.Yes:
            DeleteLine_listView(listView1); // Line 삭제
            break;
        case DialogResult.No:
            break;
    }
}

private void listView1_DragDrop(object sender, DragEventArgs e)
{
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
     if (files.Length == 1)  // 파일 1개만 추가
     {
         string fileName = files[0];
         OpenSubtitle(fileName, listView1);
     }
 }

private void listView1_DragEnter(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(DataFormats.FileDrop, false))
         e.Effect = DragDropEffects.All;
}


** 파일을 다중으로 선택하여 추가할 경우

private void listView1_DragDrop(object sender, DragEventArgs e)
{
    string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    foreach (string filename in filenames)
    {
        try
        {
            Load_MP3(filename, listView1);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}


특정한 칼럼을 숨기고 싶을 때에는 너비를 0 으로 놓고 안보이게 하는 방법이 있다.

listView1.Columns[5].Width = 0;  // 6번째 칼럼을 숨기기 처리


// listView 헤더행 숨기기

listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;

블로그 이미지

Link2Me

,
728x90

C# 에서 칼럼의 첫번째에 체크박스를 그리는 방법이다.



먼저 listView 열편집(ColumnHeader 컬렉션 편집기)을 아래와 같이 첫번째 칼럼에는 텍스트는 빈공백으로 준다.열너비는 30이나 25 정도로 주면 된다.

소스코드에 직접 적어주려면 listView1.Columns[0].Width = 25;



DB에서 가져온 정보를 listView 화면에 출력할 때 아래와 같이 처리를 해준다.

listView1.Items.Clear();
if (R.HasRows)
{
    int i = 0;
    while (R.Read())
    {
        i = i + 1;
        ListViewItem lvt = new ListViewItem();
        //lvt.Text = i.ToString();  // 첫번째 열은 값을 넣지 않는다. checkbox 용도
        lvt.SubItems.Add(i.ToString());
        lvt.SubItems.Add(R["uid"].ToString());
        lvt.SubItems.Add(R.GetString(1));
        lvt.SubItems.Add(R.GetString(2));
        lvt.SubItems.Add(R.GetString(3));
        lvt.SubItems.Add(R.GetString(4));
        listView1.Items.Add(lvt);
    }
    lvt1totalcnt.Text = "총 " + i.ToString() + " Row";
}


다.

참고한 사이트

http://stackoverflow.com/questions/1778600/listview-header-check-box

http://egloos.zum.com/seraph4021/v/4798702


listView_Table 정보를 출력하는 함수에

listView1.CheckBoxes = true;
listview.OwnerDraw = true;

다.


또는 속성창에서 아래처럼 추가를 해준다.




Event를 추가한다.



이제 코드를 추가해준다.

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
{
    if ((e.ColumnIndex == 0))
    {
        CheckBox cck = new CheckBox();
        Text = "";       
        listView1.SuspendLayout();  // 컨트롤의 레이아웃 논리를 임시로 일시 중단
        e.DrawBackground();  // 열 머리글의 배경색을 그리기
        cck.BackColor = Color.Transparent;
        cck.UseVisualStyleBackColor = true;  // 비주얼 스타일을 사용하여 배경을 그리면 true

        // 컨트롤의 범위를 지정된 위치와 크기로 설정 (Left x, Top y, width, height)
        cck.SetBounds(e.Bounds.X, e.Bounds.Y, cck.GetPreferredSize(new Size(e.Bounds.Width, e.Bounds.Height)).Width, cck.GetPreferredSize(new Size(e.Bounds.Width, e.Bounds.Height)).Width);

       // 컨트롤의 높이와 너비를 가져오거나 설정

        cck.Size = new Size((cck.GetPreferredSize(new Size((e.Bounds.Width - 1), e.Bounds.Height)).Width + 1), e.Bounds.Height);
        cck.Location = new Point(4, 0); // 왼쪽 위를 기준으로 컨트롤의 왼쪽 위의 좌표를 가져오거나 설정
        listView1.Controls.Add(cck);
        cck.Show();
        //cck.BringToFront();
       
Visible = true;  // 컨트롤과 모든 해당 자식 컨트롤이 표시되면 true

        e.DrawText((TextFormatFlags.VerticalCenter | TextFormatFlags.Left));
        cck.Click += new EventHandler(Bink);  // 컨트롤을 클릭하면 발생
        listView1.ResumeLayout(true);  // 일반 레이아웃 논리를 다시 시작

    }
    else
    {
        e.DrawDefault = true;
    }
}

// 컬럼헤더에 있는 체크박스 클릭시 나머지 체크박스들도 자동 체크되도록 하는 로직
private void Bink(object sender, System.EventArgs e)
{
    CheckBox cck = sender as CheckBox;
    for (int i = 0; i < listView1.Items.Count; i++)
    {
        listView1.Items[i].Checked = cck.Checked;
    }
}

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    e.DrawDefault = true;
}       

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
    e.DrawDefault = true;
}


이렇게 하면 체크박스는 추가가 된다.

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
로직에 문제가 있는지 몰라도 두개의 행을 선택하려고 Shift 또는 Ctrl 키를 누르면 화면이 이상해진다.
테스트 해보니까 이 부분 처리가 완벽하지 않는가 보다.


cck.BringToFront(); 부분을 주석처리하니까 이런 현상이 없어졌다.

다.


// 체크박스가 선택되어 있으면 삭제되는 함수

private void DeleteLineChecked_listView(ListView LV)
{
    for (int row = LV.Items.Count - 1; row >= 0; row--)
    {
        if (LV.Items[row].Checked)
        {
            //LV.Items.Remove(LV.Items[row]);
            LV.Items.RemoveAt(row);
        }
    }
    listView_No(LV);  // 번호 다시 매기기
}


listView1.CheckedItems.Count

while (LV.CheckedItems.Count > 0)
{
    ListViewItem row = LV.CheckedItems[0]; // 체크된 것 하나씩 지우면 첫번째 것이 된다
    LV.Items.Remove(row);
}


체크된 Line 을 다른 listView 로 복사하는 방법

private void CheckedLineCopyTo_listView(ListView LV1, ListView LV2)
{
    for (int row = LV1.Items.Count - 1; row >= 0; row--)  // 총 Line
    {
        if (LV1.Items[row].Checked)  //
        {
            LV2.Items[row].SubItems[3].Text = LV1.Items[row].SubItems[3].Text;  // listView1 서 listView2
        }
    }
    LV2.Update();  // listView2
}



블로그 이미지

Link2Me

,
728x90

listView 에서 행을 병합할 때 사용하는 코드입니다. 이 코드는 특정한 셀기준으로 병합처리를 했다. 여러행을 같이 처리하라면 더 추가해야 한다. 개념적인 것만 알아두면 응용은 할 수 있다.


private void LineMerge(ListView LV)
{
    // 첫번째 row 에 데이터 같이 저장, 두번째이후 row 삭제처리
    if (LV.SelectedIndices.Count >= 2)
    {
        for (int i = 0; i < LV.SelectedIndices.Count; i++)
        {
            string str = LV.SelectedItems[i].SubItems[2].Text;
            merge_str += str + System.Environment.NewLine; // 줄바꿈문자
        }
        LV.SelectedItems[0].SubItems[2].Text = merge_str.Trim();
        // MessageBox.Show(merge_str);  //
        merge_str = string.Empty;
        for (int i = LV.SelectedIndices.Count - 1; i > 0; i--)
        {
            LV.Items.Remove(LV.SelectedItems[i]); // 삭제는 index 번호가 큰번호에서 작은번호 순으로
        }
        listView_No(LV);  // renumbering
    }
    else
    {
        MessageBox.Show("최소 2개의 행을 선택해야 합니다");
        return;
    }
}


2. 선택된 Line 의 바로 이전행과 병합할 때

키포인트는 선택된 행의 index 를 구한 다음에 이전 행의 index 를 구해서
LV.Items[i].SubItems[3].Text // i = selectedindex
즉 LV.SelectedItems[0].SubItems[3].Text 가 아니라는 점이다.

private void LineMergeWithLineBefore(ListView LV)
{
    string delimiter = System.Environment.NewLine;
    if (LV.SelectedIndices.Count > 0)
    {
        int selectedindex = LV.SelectedItems[0].Index;
        int previousindex = selectedindex - 1;
        merge_str = LV.Items[previousindex].SubItems[3].Text + delimiter + LV.Items[selectedindex].SubItems[3].Text;
        LV.Items[previousindex].SubItems[3].Text = merge_str.Trim();
        LV.Items.Remove(LV.Items[selectedindex]);

        listView_No(LV);
    }
}


3. 선택된 Line 의 바로 다음행과 병합할 때

private void LineMergeWithLineAfter(ListView LV)
{
    string delimiter = System.Environment.NewLine;
    if (LV.SelectedIndices.Count > 0)
    {
        int selectedindex = LV.SelectedItems[0].Index;
        int nextindex = selectedindex + 1;
        merge_str = LV.Items[selectedindex].SubItems[3].Text + delimiter + LV.Items[nextindex].SubItems[3].Text;
        LV.Items[selectedindex].SubItems[3].Text = merge_str.Trim();
        LV.Items.Remove(LV.Items[nextindex]);

        listView_No(LV);
    }
}



블로그 이미지

Link2Me

,
728x90

listView 내용을 텍스트로 저장하는 방법을 작성해봤다.

간단하게 작성하는 방법도 있지만, 원하는 열만 출력하고 싶은 경우가 있어서 이 부분을 고려해서 작성했다.

현재 읽어들인 파일명까지 인식하여 저장하는 것은 아직 구현을 못했다.


private void saveDataToolStripMenuItem_Click(object sender, EventArgs e)
{
    SaveFile();
}

private void SaveFile()
{
    SaveFileDialog sfd1 = new SaveFileDialog();
    sfd1.Title = "텍스트 파일 저장";
    sfd1.FileName = string.Empty;
    sfd1.Filter = "텍스트파일 (*.txt)|*.txt";
    if (sfd1.ShowDialog(this) == DialogResult.OK)
    {
        try
        {
            SaveData_listView(sfd1.FileName, listView1);
        }
        catch
        {
            MessageBox.Show("Excel 파일 저장중 에러가 발생했습니다.");
            return;
        }
        MessageBox.Show(Path.GetFileName(sfd1.FileName) + " 파일을 저장했습니다.");               
    }
}

private void SaveData_listView(string fileName, ListView LV)
{
    // Text 파일로 데이터 저장
    string delimeter = Environment.NewLine;  // 줄바꿈(개행문자)
    using (TextWriter textExport = new StreamWriter(fileName))
    {
        if (LV.Items.Count == 0)
        {
            MessageBox.Show("저장할 내용이 없습니다");
            return;
        }

        foreach (ListViewItem item in LV.Items)
        {
            for (int i = 0; i < item.SubItems.Count - 1; i++) // SubItems (열)을 전부 순환하는데 마지막은 제외
            {
                if (i != 1)  // 출력하고 싶지 않은 열 지정
                {
                    textExport.Write(item.SubItems[i].Text);
                    textExport.Write(";");
                    //textExport.Write(delimeter);  // 줄바꿈으로 처리하고 싶을 때
                }                       
            }
            textExport.Write(delimeter);
        }

        textExport.Flush(); // flush from the buffers
        textExport.Close();
    }
}


위 코드 파일 소스

Text_Export.cs



'C# > listView' 카테고리의 다른 글

C# listView Checkbox 추가하는 방법  (2) 2015.10.04
C# listView Line Merge(행 병합)  (0) 2015.10.03
C# listView 행높이 지정 방법  (0) 2015.09.27
C# listView ContextMenu 에서 행 삭제  (0) 2015.09.26
C# ListView 기능 분석  (0) 2015.09.14
블로그 이미지

Link2Me

,
728x90
listView 기능을 익히면서 MySQL DB에 있는 데이터를 가져와서 출력하는데, MySQL DB에는 저장하지 않고 화면상에서만 기능이 동작하도록 하면서 기능을 확인하니까 엄청 편하다.


C# listView 기본 값은 행간격이 너무 좁아서 좀 답답하다.




행높이를 이렇게 약간 넓게 조정하는 방법


private void SetHeight(ListView LV, int height)
{
      // listView 높이 지정
      ImageList imgList = new ImageList();
      imgList.ImageSize = new Size(1, height);
      LV.SmallImageList = imgList;
}


이 함수를 코드에 추가한다.

이제 SetHeight(listView1, 20); 을 listView_Table 함수에 한줄 추가해주면 된다.

20 숫자는 화면에 출력될 사이즈에 맞게 조절하면 된다.







'C# > listView' 카테고리의 다른 글

C# listView Checkbox 추가하는 방법  (2) 2015.10.04
C# listView Line Merge(행 병합)  (0) 2015.10.03
C# listView 텍스트파일로 저장  (0) 2015.09.29
C# listView ContextMenu 에서 행 삭제  (0) 2015.09.26
C# ListView 기능 분석  (0) 2015.09.14
블로그 이미지

Link2Me

,
728x90

listView1 에서 마우스 우클릭하여 행을 추가, 삭제하고 싶다면 어떻게 해야 할까?

선택한 행만 삭제하도록 구현할 경우와 다중 삭제를 할 수 있도록 구현하는 방법이 각각 다르다.



ContextMenu 에 listView1 서 ContextMenuStrip 다.




이제 ContextMenu 항목을 추가한 다음에

private void lineDeleteToolStripMenuItem_Click(object sender, EventArgs e)
{
    // 선택한 Line 다중 삭제
    foreach (ListViewItem item in listView1.SelectedItems)
    {
        listView1.Items.Remove(item);
    }
    listView1.Update();
}

private void lineDeleteToolStripMenuItem_Click(object sender, EventArgs e)
{
     if (listView1.SelectedItems.Count > 0)   // 선택한 Line 만 삭제됨
     {
         listView1.SelectedItems[0].Remove();
         listView1.Update();
     }
}


이걸 ListView1 에서만 사용하는 것이 아니라 listView2 에서도 같이 사용하고자 하면 함수로 만드는게 좋다.

여러 행을 지울 때 지우고 난 이후 첫번째 행으로 선택되게 하려면 첫번째 선택한 행의 index 값을 구하면 된다.

선택한 행의 index 값을 알아보려면 아래와 같이 하면 된다.

for (int i = 0; i < LV.SelectedItems.Count; i++)
{
    MessageBox.Show(LV.SelectedIndices[i].ToString());
}

// ----- Line Delete Func ------ //

private void lineDeleteToolStripMenuItem_Click(object sender, EventArgs e)
{
    Delete_listView(listView1);
}

private void Delete_listView(ListView LV)
{

    if (LV.SelectedItems.Count <= 0)

    {

          MessageBox.Show("선택된 행이 없습니다");

          return;

    }

    int index = LV.SelectedIndices[0]; // 첫번째 선택 index   
    foreach (ListViewItem item in LV.SelectedItems)
    {
        LV.Items.Remove(item); 
// 선택한 행 삭제   

    }
    listView_No(LV);  // 번호 다시 매기기
    if (index > LV.Items.Count -1) // index 가 마지막 행보다 크면
    {
        index = LV.Items.Count -1;
    }
    LV.Items[index].Selected = true;
    LV.Items[index].EnsureVisible();
}

private void listView_No(ListView LV)
{
    // 번호 매기기
    for (int i = 0; i < LV.Items.Count; i++)
    {
        LV.Items[i].Text = (i + 1).ToString();
    }
}

'C# > listView' 카테고리의 다른 글

C# listView Checkbox 추가하는 방법  (2) 2015.10.04
C# listView Line Merge(행 병합)  (0) 2015.10.03
C# listView 텍스트파일로 저장  (0) 2015.09.29
C# listView 행높이 지정 방법  (0) 2015.09.27
C# ListView 기능 분석  (0) 2015.09.14
블로그 이미지

Link2Me

,
728x90

ListView는 목록을 표시하는 컨트롤이다.


ListView 를 Layout 에 추가하는 방법은 도구상자에게 ListView 를 Drag 해서 뿌려질 화면위에 놓는다.




폼에서 설정해주면 *.Designer.cs 파일에 설정값이 저장된다.

this.listView1.GridLines = true;

this.listView1.View = System.Windows.Forms.View.Details;

폼 UI 에서 설정하지 않고 사용자 소스파일에서 listView1.View = View.Details; 라고 직접 설정해줘도 된다.


FullRowSelect : 항목이 선택될 때 하위 항목까지 한줄 전체를 선택한다.

MultiSelect : 복수 개의 항목을 선택할 수 있는지를 지정한다.

LabelEdit : 실행 중에 항목을 직접 편집할 수 있는지의 여부를 지정한다. default 는 false 이다.

LabelWrap : 항목의 텍스트를 줄바꿈하여 출력할 것인가를 지정한다.

Focuseditem : 현재 포커스를 가진 항목을 조사한다.



ListView 의 열(Column)의 편집은 칼럼(열)의 헤더를 설정(text, size)하는 방법이다.




칼럼 헤더의 Text, TextAlign, Width 를 지정한다.





dataGridView 와는 달리 listView 에서는 행(Row)는 첫열을 기준으로 해서 Item, 다음열부터는 subItem 으로 값을 입력한다.



listView1.Items.Clear(); // 데이터 내용 전부 지우기

listView1.Items.Count;  // 전체 항목의 개수 카운트


// listView 헤더행 숨기기

listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;


선택된 항목 지우기

if (listView1.SelectedItems.Count == 0)
{
    MessageBox.Show("선택된 항목이 하나도 없습니다.");
}
else
{
    while (listView1.SelectedItems.Count > 0)
        listView1.Items.Remove(listView1.SelectedItems[0]);
}



if (listView1.SelectedItems.Count > 0)
{
    int index = listView1.SelectedIndices[0]; // 선택된 첫번째 레코드의 인덱스
    foreach (ListViewItem row in listView1.SelectedItems)
    {

        int index = row.index;

        listView1.Items.Remove(row);  // 선택한 행 삭제
       
// listView1.Items[index].Remove();  // 다. index

    }
}


for (int row = 0; row < listView1.Items.Count; row++)
{
    string text = listView1.Items[row].SubItems[4].Text;
    if (Left(text,1) =="(" && Right(text,1) ==")")
    {
        listView1.Items[row].Remove();  // 선택한 행 삭제
    }
}


for (int row = listView1.SelectedIndices.Count - 1; row > 0; row--)
{
    index = listView1.SelectedItems[row].Index//
    listView1.Items[index].Remove(); // 삭제는 index 번호가 큰번호에서 작은번호 순으로
}



리스트 추가하기

private void btnAdd_Click(object sender, EventArgs e) // 추가 버튼
{
    ListViewItem lvt = new ListViewItem();
    lvt.Text = textBox1.Text;
    lvt.SubItems.Add(textBox2.Text);
    lvt.SubItems.Add(textBox3.Text);
    lvt.SubItems.Add(textBox4.Text);
    lvt.SubItems.Add(textBox5.Text);
    listView1.Items.Add(lvt);

    listView1.FullRowSelect = true;  // 행단위로 선택


    textBox1.Text ="";
    textBox2.Text ="";
    textBox3.Text ="";
    textBox4.Text ="";
    textBox5.Text ="";

}


* 다른 방법으로
ListViewItem lvt = new ListViewItem();
lvt.Text = textBox1.Text;

2줄을 한줄로 줄여서

ListViewItem lvt = new ListViewItem(textBox1.Text);

로 해도 된다.


리스트 수정하기

private void btnChange_Click(object sender, EventArgs e)    // 변경 버튼
{
    if (listView1.SelectedIndices.Count > 0)
    {
        listView1.SelectedItems[0].SubItems[0].Text = textBox1.Text;
        listView1.SelectedItems[0].SubItems[1].Text = textBox2.Text;
        listView1.SelectedItems[0].SubItems[2].Text = textBox3.Text;
        listView1.SelectedItems[0].SubItems[3].Text = textBox4.Text;
        listView1.SelectedItems[0].SubItems[4].Text = textBox5.Text;
    }
}


리스트 읽어오기

private void listView1_Click(object sender, EventArgs e)  // 해당 Row 클릭시 읽어오기
{
    if (listView1.SelectedIndices.Count > 0)
    {
        textBox1.Text = listView1.SelectedItems[0].SubItems[0].Text;
        textBox2.Text = listView1.SelectedItems[0].SubItems[1].Text;
        textBox3.Text = listView1.SelectedItems[0].SubItems[2].Text;
        textBox4.Text = listView1.SelectedItems[0].SubItems[3].Text;
        textBox5.Text = listView1.SelectedItems[0].SubItems[4].Text;
    }
}


private void listView1_KeyUp(object sender, EventArgs e)  // 해당 Row 에 키보드가 놓일때
{
    if (listView1.SelectedIndices.Count > 0)
    {
        textBox1.Text = listView1.SelectedItems[0].SubItems[0].Text;
        textBox2.Text = listView1.SelectedItems[0].SubItems[1].Text;
        textBox3.Text = listView1.SelectedItems[0].SubItems[2].Text;
        textBox4.Text = listView1.SelectedItems[0].SubItems[3].Text;
        textBox5.Text = listView1.SelectedItems[0].SubItems[4].Text;
    }
}



번호 매기기

for(int i=0 ; i < listView1.Items.Count ; i++)
{
    listView1.Items[i].SubItems[0].Text = (i + 1).ToString();
}


foreach (ListViewItem item in listView1.Items)
{
    // 수행할 내용
}



열의 특정값 변경

private void LVCellUpdate(ListView LV)
{
    int value = 0;
    foreach (ListViewItem row in LV.Items)
    {
        int.TryParse(row.SubItems[4].Text, out value);
        if (value == 10)
        {
            row.SubItems[4].Text = "보통";
        }
    }
}



private void LVCellUpdate(ListView LV)
{
    int value = 0;
    for (int row = 0; row < LV.Items.Count; row++)
    {
        //MessageBox.Show(LV.Items[row].SubItems[4].Text);
        int.TryParse(LV.Items[row].SubItems[4].Text, out value);
        if (value == 10)
        {
            LV.Items[row].SubItems[4].Text = "보통";
        }
    }
}


각 행(row)을 반복해서 돌아가면서 해당 행의 특정열의 값을 구하거나 다른 값으로 치환하고자 할 경우에는 LV.Items[row].SubItems[4].Text; 만 알면
선택된 행으로부터 currentindex 를 구할 수가 있다.
index 만 구하면 해당행을 삭제하거나 병합할 수 있다.


listView1.Items[previousindex].Selected = true;  //


listView2.Items[index].EnsureVisible();  // 내용을 스크롤하여 항목이 컨트롤에 표시되도록 함


// 상은

private void listView_ColorSet(ListView LV)
{
    for (int row = 0; row < LV.Items.Count; row++)
    {
        if (LV.Items[row].BackColor.Equals(Color.Aquamarine))
        {
            LV.Items[row].BackColor = Color.Aquamarine;
        } else if (LV.Items[row].BackColor.Equals(Color.YellowGreen))
        {
            LV.Items[row].BackColor = Color.YellowGreen;       
        }
        else
        {
            LV.Items[row].BackColor = Color.White;
        }               
    }
}

블로그 이미지

Link2Me

,