listView CheckBox 질문있습니다.

안녕하세요~ 윈폼 질문드립니다.
listView.CheckBoxes = true 해서 체크박스를 나오게했는데
이 체크박스 사이즈를 조절할수는 없나요?? 제가 못찾는건지
어디서 컨트롤을할수있는지 알수가없네요…

1개의 좋아요

Windows Forms 리스트 뷰의 경우에는 WPF와 달리 체크박스 부분을 커스터마이징하기 위해 그리기 코드를 직접 손을 대서 수정하셔야 합니다.

이 스레드의 내용이 도움이 되실겁니다.

2개의 좋아요

실마리를 찾앗는데 쉽진 않네요…

헤더까지는 된거같은데

아이템쪽이 문제네요…
image

1개의 좋아요

아이템쪽도 마찬가지로 ‘직접’ 그리셔야 합니다.,ㅎㅎ

갑자기 기억이 나서 대략 13년 전쯤 윈폼으로 C#공부를 했었을때 소스코드를 뒤져서 찾아봤는데
데이터그리드뷰 셀 페인팅 처리 했던 코드가 있길래 도움이 되실지 모르겠지만 한번 공유 드려 봅니다.
(아무것도 모르고 혼자서 끄적 했던 시절이라 맴버필드를 전역변수라고 주석으로 써놓기도 했었네요)

/// <summary>
/// Paint메소드 오버라이드 DataGridViewImageCell클래스를 상속받는 클래스
/// </summary>
public class ImageTextCell : DataGridViewImageCell
{
        #region 전역 필드들
        private string _text;
        #endregion

        public ImageTextCell()
        {
            base.ImageLayout = DataGridViewImageCellLayout.Stretch;
        }

        public string Text
        {
            get { return _text; }
            set { _text = value; }
        }

        protected override void OnClick(DataGridViewCellEventArgs e)
        {
            base.OnClick(e);
            // 요기서 셀 클릭시 Checked / Uncheck 이미지를 번갈아 가며 바꿀 수 있습니다.
        }

        protected override void Paint(Graphics graphics, Rectangle clipBounds,
            Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState,
            object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            // 설명글 출력 부분 마지막의 cellBounds.X, cellBounds.Y로 텍스트의 위치를 잡습니다.
            if ( !value.Equals( base.DefaultNewRowValue ) )
                graphics.DrawString(Text, Control.DefaultFont, Brushes.Blue, cellBounds.X, cellBounds.Y);

            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, 
                formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        }
}

구현된 ImageTextCell은 DataGridViewColumn 으로 사용 할 수 있습니다.

DataGridViewColumn CustomCol = new DataGridViewColumn( new ImageTextCell() );

위에 예시 코드에서는 이미지와 함께 표시되는 문구 Text를 속성으로 받아 사용하는데
체크박스 역할로 Checked이미지와 Unchecked 이미지 두개를 받아서 OnClick 시 상황에 맞게 번갈아 가면서 그려주면 될 것 같습니다.

3개의 좋아요
        private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
        {
                TextFormatFlags flags = TextFormatFlags.LeftAndRightPadding;
                e.DrawBackground();


            var b = e.Bounds;
                var state = clicked ? CheckBoxState.CheckedNormal : CheckBoxState.UncheckedNormal;
                Size glyphSize = CheckBoxRenderer.GetGlyphSize(e.Graphics, state);
                int checkPad = (b.Height - glyphSize.Height) / 2;
                var pt = new Point(b.X + 2, b.Y + 2);

                Rectangle rect = new Rectangle(pt, new Size(18, 18));
                e.Graphics.DrawRectangle(Pens.Green, rect);//This is for Checkbox rectangle

                if (state == CheckBoxState.CheckedNormal)
                {
                    using (SolidBrush brush = new SolidBrush(ForeColor))
                    using (Font wing = new Font("Wingdings", 17f, FontStyle.Bold))
                        e.Graphics.DrawString("ü", wing, brush, pt.X - 4, pt.Y - 1); //This is For tick mark
                }

                
                e.DrawText(flags);
        }

이렇게 해서
image
여기 까지 진행이됬습니다…
기존에 있는 체크 박스를 어떻게 가려야할까요…