none
DataGridViewCell的只读问题 RRS feed

  • 问题

  • 我的问题:在一个datagridview中,的一些列,只有增加时才可以编辑,否则不能编辑,我采取的方法是查询后将该列的所有Cell设为只读,代码如下:
    DataTable DT_DV2_OUT = info_unit.Get_Link_UnitMatData(MODELID.ToString(), UNITID.ToString(), "-1").Tables[0];
    dv2_Out.DataSource = DT_DV2_OUT;
    foreach (DataGridViewRow gv in dv2_Out.Rows)
    {
    gv.Cells["U_MATERIAL_ID"].ReadOnly = true;
    }

    其中:dv2_Out为datagridview,info_unit为业务逻辑对象,列U_MATERIAL_ID编辑类型为下拉列表框

    执行完以上代码后我跟踪了一下,gv.Cells["U_MATERIAL_ID"].ReadOnly已经是True了,但界面上U_MATERIAL_ID列的值还是可以修改。请大家帮我看看,应该怎么做才可以实现此功能。
    2011年10月11日 1:45

答案

  • Hi 漂在北京的风筝:
    欢迎来到MSDN论坛!

    我们可以考虑使用 DataGridViewComboBoxColumn 类,然后对该列的单元格 ReadOnly 属性进行设置。

    请参考以下方案:

            private void Form1_Load(object sender, EventArgs e)
            {
                this.dataGridView1.Columns.Add("IDColumn", "ID");
                this.dataGridView1.Columns.Add("NameColumn", "Name");
    
                // 添加ComboBox列
                AddComboBoxColumns();
    
                for (int i = 1; i < 11; i++)
                {
                   this.dataGridView1.Rows.Add(i, "Col" + i,"Mr.");
                }
    
                // 设置行为非新行时,单元格只读.
                foreach (DataGridViewRow gv in dataGridView1.Rows)
                {                
                    if (!gv.IsNewRow)
                    {
                        gv.Cells[2].ReadOnly = true;
                    }
                }        
            }
    
            private void AddComboBoxColumns()
            {
                DataGridViewComboBoxColumn comboboxColumn;
                comboboxColumn = CreateComboBoxColumn();
                dataGridView1.Columns.Add(comboboxColumn);
            }
    
            private DataGridViewComboBoxColumn CreateComboBoxColumn()
            {
                DataGridViewComboBoxColumn column =
                    new DataGridViewComboBoxColumn();
                {
                    column.Items.AddRange("Mr.", "Ms.", "Mrs.", "Dr.");
                    column.HeaderText = "Title";
                    column.DropDownWidth = 160;
                    column.Width = 90;
                    column.MaxDropDownItems = 3;
                    column.FlatStyle = FlatStyle.Flat;
                }
                return column;
            }
    

    效果如下:

     

    请您参考以下链接已获取更多关于 DataGridViewComboBoxColumn 的信息:

    DataGridViewComboBoxColumn
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcomboboxcolumn.aspx

    祝您,一切顺利!

     


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月12日 9:00
    版主

全部回复

  • 我直接拖拽了一个dataGridView到页面上,然后直接绑定一个DataTable(注意:我的DataGridView是自动生成列的!)

     private void Form1_Load(object senderEventArgs e)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Id"typeof(int));
                dt.Columns.Add("Name"typeof(string));

                for (int i = 1i < 11i++)
                {
                    dt.Rows.Add(i"Col" + i);
                }

                dataGridView1.DataSource = dt;
               
                foreach (DataGridViewRow item in dataGridView1.Rows)
                {
                    item.Cells[0].ReadOnly = true;
                }

                //如果不行,请注释掉foreach循环,使用这句!
                dataGridView1.Columns[0].ReadOnly = true;
            }

    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月11日 2:17
    版主
  • 我的代码和你的代码是一致的呀,难道你的成吗?dataGridView1.Columns[0].ReadOnly = true;是设置整个列只读的。

    foreach (DataGridViewRow gv in dv2_Out.Rows)
    {
    gv.Cells["U_MATERIAL_ID"].ReadOnly = true;
    }


    foreach (DataGridViewRow item in dataGridView1.Rows)
    {
    item.Cells[0].ReadOnly = true;
    }

    2011年10月11日 3:21
  • cellenter事件 if(是新加行) { dv2_Out.Rows[e.RowIndex].Cells["U_MATERIAL_ID"].ReadOnly = false; } else { dv2_Out.Rows[e.RowIndex].Cells["U_MATERIAL_ID"].ReadOnly = true; }
    http://feiyun0112.cnblogs.com/
    2011年10月11日 3:30
    版主
  • 我的代码和你的代码是一致的呀,难道你的成吗?dataGridView1.Columns[0].ReadOnly = true;是设置整个列只读的。

    foreach (DataGridViewRow gv in dv2_Out.Rows)
    {
    gv.Cells["U_MATERIAL_ID"].ReadOnly = true;
    }


    foreach (DataGridViewRow item in dataGridView1.Rows)
    {
    item.Cells[0].ReadOnly = true;
    }


    是的,我的两种方法都可以。你愿意的话给你发送我的演示项目,请留下Email
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月11日 4:17
    版主
  • cellenter事件 if(是新加行) { dv2_Out.Rows[e.RowIndex].Cells["U_MATERIAL_ID"].ReadOnly = false; } else { dv2_Out.Rows[e.RowIndex].Cells["U_MATERIAL_ID"].ReadOnly = true; }

     

    现在的问题是:

    dv2_Out.Rows[e.RowIndex].Cells["U_MATERIAL_ID"].ReadOnly = true;

    不起作用


    2011年10月11日 9:20
  • 你尝试过我的方法了吗?两个方法,应该可以的。留下Email,我给你发一个示例去。
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年10月12日 1:09
    版主
  • Hi 漂在北京的风筝:
    欢迎来到MSDN论坛!

    我们可以考虑使用 DataGridViewComboBoxColumn 类,然后对该列的单元格 ReadOnly 属性进行设置。

    请参考以下方案:

            private void Form1_Load(object sender, EventArgs e)
            {
                this.dataGridView1.Columns.Add("IDColumn", "ID");
                this.dataGridView1.Columns.Add("NameColumn", "Name");
    
                // 添加ComboBox列
                AddComboBoxColumns();
    
                for (int i = 1; i < 11; i++)
                {
                   this.dataGridView1.Rows.Add(i, "Col" + i,"Mr.");
                }
    
                // 设置行为非新行时,单元格只读.
                foreach (DataGridViewRow gv in dataGridView1.Rows)
                {                
                    if (!gv.IsNewRow)
                    {
                        gv.Cells[2].ReadOnly = true;
                    }
                }        
            }
    
            private void AddComboBoxColumns()
            {
                DataGridViewComboBoxColumn comboboxColumn;
                comboboxColumn = CreateComboBoxColumn();
                dataGridView1.Columns.Add(comboboxColumn);
            }
    
            private DataGridViewComboBoxColumn CreateComboBoxColumn()
            {
                DataGridViewComboBoxColumn column =
                    new DataGridViewComboBoxColumn();
                {
                    column.Items.AddRange("Mr.", "Ms.", "Mrs.", "Dr.");
                    column.HeaderText = "Title";
                    column.DropDownWidth = 160;
                    column.Width = 90;
                    column.MaxDropDownItems = 3;
                    column.FlatStyle = FlatStyle.Flat;
                }
                return column;
            }
    

    效果如下:

     

    请您参考以下链接已获取更多关于 DataGridViewComboBoxColumn 的信息:

    DataGridViewComboBoxColumn
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcomboboxcolumn.aspx

    祝您,一切顺利!

     


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年10月12日 9:00
    版主