none
如何動態新增Radio button 至Datagridview RRS feed

  • 問題

  • 各位前輩小弟遇到以下問題:

    目前想用Datagridview+Radio button製作可選擇的Map(欄位與Radio皆為動態新增)

    https://imgur.com/TBzoQzn(不能貼圖故放上網址)

    目前遇到兩個問題:

    1.如何將Radio放入指定欄位?目前是使用算座標的方式但是會出現灰色方格(應該是文字部分)

                       RadioButton radio = new RadioButton();
                        
                        data_map.Controls.Add(radio);

                        radio.Location = new Point(50+20,20);

    imgur.com/fuzPGkh(不能貼圖故放上網址)


    2.新增的radio 要怎麼配對呢?若需要同一Row為一組


    2018年4月3日 上午 08:03

解答

  • 我參考 In datagridview how to use checkbox as radiobutton? 當中的一個答案

    用了一個比較土砲的方式,實現你的需求~

    簡單的說,只是把 DataGridViewCheckBoxColumn 的 CheckBox 「畫」成 RadioButton,再加上同列不同時被選擇的需求

    首先先在 Form 上拉好一個 DataGridView(dataGridView1),再把 EditMode 屬性改為 EditOnEnter。之後加入數行 DataGridViewCheckBoxColumn,並實做 dataGridView1 的三個 event (CellPainting、CurrentCellDirtyStateChanged、CellClick),詳細如下:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.RowIndex < 0 || e.ColumnIndex <0)
                return;
    
            if (!(dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
                return;
            
            e.PaintBackground(e.ClipBounds, true);
    
            var rectRadioButton = new Rectangle();
            rectRadioButton.Width = 14;
            rectRadioButton.Height = 14;
            rectRadioButton.X = e.CellBounds.X + (e.CellBounds.Width - rectRadioButton.Width) / 2;
            rectRadioButton.Y = e.CellBounds.Y + (e.CellBounds.Height - rectRadioButton.Height) / 2;
            ButtonState buttonState;
            if (e.Value == null || e.Value == DBNull.Value || (bool)(e.Value) == false)
                buttonState = ButtonState.Normal;
            else
                buttonState = ButtonState.Checked;
            ControlPaint.DrawRadioButton(e.Graphics, rectRadioButton, buttonState);
            e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus);
            e.Handled = true;
        }
    
        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            RadioButtonChanged();
        }
    
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            var cell = dataGridView1[e.ColumnIndex, e.RowIndex];
            cell.Value = true;
            RadioButtonChanged();
        }
    
        private void RadioButtonChanged()
        {
            for (int columnIndex= 0; columnIndex<dataGridView1.ColumnCount; columnIndex++ )
            {
                var cell = dataGridView1[columnIndex, dataGridView1.CurrentCell.RowIndex];
                if (cell is DataGridViewCheckBoxCell && cell != dataGridView1.CurrentCell)
                {
                    cell.Value = false;
                }
            }
        }
    }

    不確定你的 RadioButton 是不是還要有 Label 的部份,如果要的話可能繪製那邊還要略做修正~

    希望這有幫上你的忙~



    • 已編輯 Mystic Lin 2018年4月4日 上午 05:25 補充Property說明
    • 已標示為解答 RaytoRay 2018年4月10日 上午 08:34
    2018年4月3日 下午 04:24

所有回覆

  • https://msdn.microsoft.com/en-us/library/aa730882(v=vs.80).aspx

    上面這篇文章應該對你的需求有些啟發。

    不過我有另外一個建議,如果你的 Desktop Application 需要在 UI 上做許多花樣的話, 用 WPF 可能是比較好的選擇。基本上你這個需求用 WPF 做就會非常簡單。
    關於 WPF 參考 Windows Presentation Foundation


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2018年4月3日 下午 12:18
    版主
  • 我參考 In datagridview how to use checkbox as radiobutton? 當中的一個答案

    用了一個比較土砲的方式,實現你的需求~

    簡單的說,只是把 DataGridViewCheckBoxColumn 的 CheckBox 「畫」成 RadioButton,再加上同列不同時被選擇的需求

    首先先在 Form 上拉好一個 DataGridView(dataGridView1),再把 EditMode 屬性改為 EditOnEnter。之後加入數行 DataGridViewCheckBoxColumn,並實做 dataGridView1 的三個 event (CellPainting、CurrentCellDirtyStateChanged、CellClick),詳細如下:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.RowIndex < 0 || e.ColumnIndex <0)
                return;
    
            if (!(dataGridView1.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
                return;
            
            e.PaintBackground(e.ClipBounds, true);
    
            var rectRadioButton = new Rectangle();
            rectRadioButton.Width = 14;
            rectRadioButton.Height = 14;
            rectRadioButton.X = e.CellBounds.X + (e.CellBounds.Width - rectRadioButton.Width) / 2;
            rectRadioButton.Y = e.CellBounds.Y + (e.CellBounds.Height - rectRadioButton.Height) / 2;
            ButtonState buttonState;
            if (e.Value == null || e.Value == DBNull.Value || (bool)(e.Value) == false)
                buttonState = ButtonState.Normal;
            else
                buttonState = ButtonState.Checked;
            ControlPaint.DrawRadioButton(e.Graphics, rectRadioButton, buttonState);
            e.Paint(e.ClipBounds, DataGridViewPaintParts.Focus);
            e.Handled = true;
        }
    
        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            RadioButtonChanged();
        }
    
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            var cell = dataGridView1[e.ColumnIndex, e.RowIndex];
            cell.Value = true;
            RadioButtonChanged();
        }
    
        private void RadioButtonChanged()
        {
            for (int columnIndex= 0; columnIndex<dataGridView1.ColumnCount; columnIndex++ )
            {
                var cell = dataGridView1[columnIndex, dataGridView1.CurrentCell.RowIndex];
                if (cell is DataGridViewCheckBoxCell && cell != dataGridView1.CurrentCell)
                {
                    cell.Value = false;
                }
            }
        }
    }

    不確定你的 RadioButton 是不是還要有 Label 的部份,如果要的話可能繪製那邊還要略做修正~

    希望這有幫上你的忙~



    • 已編輯 Mystic Lin 2018年4月4日 上午 05:25 補充Property說明
    • 已標示為解答 RaytoRay 2018年4月10日 上午 08:34
    2018年4月3日 下午 04:24
  • 您可以參考這篇文件建RadioButton欄位給DataGridView使用:

    Build a Custom RadioButton Cell and Column for the DataGridView Control

    2018年4月3日 下午 10:27
  • 感謝建議! 我會開始嘗試WPF
    2018年4月10日 上午 08:34
  • 感謝您的幫助!
    2018年4月10日 上午 08:34