问题1:datagrid默认是textBox控件。鼠标点在上面可以修改数据,但怎么通过一个按钮进行数据的保存呢??问题2:通过按钮读取数据后,datagrid中读取到几行就在那几行中,第一列添加combobox控件。怎么做??

解决方案 »

  1.   

    1。保存按钮是一行一个还是保存按钮在dataGridView外部?如果是在外面,就只能循环读取每行每列了
    2.数据列名是固定的吗?如果是的话,则把第一列的类型改为复选框,其它为默认的文本框
      

  2.   

    我这个是添加button的,意思应该差不多,做的不好        #region "变量定义"
                /// <summary>
                /// 定义按钮
                /// </summary>
                private Button btn;
                /// <summary>
                /// 定义bindingsource
                /// </summary>
                private BindingSource bds;
                /// <summary>
                /// 数值结构
                /// </summary>
                private struct ScrollSize
                {
                    public int Height;
                    public int Width;
                }
                /// <summary>
                /// 设置记录滚动条值传递
                /// </summary>
                private ScrollSize MyScroll = new ScrollSize();
                /// <summary>
                /// 定义按钮btn弹出的窗体
                /// </summary>
                private Form2 Frmbtn;        #endregion        #region "窗体事件"
            public Form1()
            {
               btn = new Button();
               InitializeComponent();
               this.dataGridView1.RowTemplate.Height = 19;
               this.dataGridView1.RowHeadersWidth = 15;
            }
            /// <summary>
            /// 窗体登陆事件
            /// </summary>
            /// <param name="sender">Form1</param>
            /// <param name="e"></param>
            private void Form1_Load(object sender, EventArgs e)
            {
                String strConn=@"Data Source=yblzr\Sqlexpress;Initial Catalog=test;Integrated Security=True;Pooling=False";
                String strSQL = @"select * from tbl_emp";
                
                SqlConnection Conn=new SqlConnection(strConn);
                //设置按钮
                
                //委托事件
                this.btn.Click += new EventHandler(this.btn_Click);
                this.dataGridView1.RowHeadersWidthChanged += new EventHandler(this.dataGridView1_RowHeadersWidthChanged);
                this.dataGridView1.ColumnHeadersHeightChanged += new EventHandler(this.dataGridView1_ColumnHeadersHeightChanged);
                //移除事件
                //this.btn.Click -= new EventHandler(this.btn_Click);
             
                btn.Width = 20;
                this.dataGridView1.AllowUserToAddRows = false;
                this.dataGridView1.Controls.Add (btn);
                btn.Visible = false;            DataSet ds = new DataSet();
                try
                {
                    SqlDataAdapter da = new SqlDataAdapter(strSQL, Conn);
                    da.Fill(ds, "tbl_emp");
                    //设置ID为唯一
                    //ds.Tables["tbl_emp"].Columns["ID"].Unique = true;
                }
                catch(Exception ex)
                {
                    MessageBox.Show(this, ex.Message);
                }
                //设置bindingsource
                this.bds = new BindingSource();
                this.bds.DataSource = ds;
                this.bds.DataMember = "tbl_emp";
                this.dataGridView1.ReadOnly  = true;
                this.dataGridView1.DataSource = bds;
                //设置列不能排序
                for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
                    this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
            }
                #endregion        #region "设置按钮btn位置事件"
            /// <summary>
            /// 单元格收到焦点事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
            {
                if (this.dataGridView1.RowCount == 0)
                    return;
                int a = this.dataGridView1.DisplayedRowCount(true);
                if (this.dataGridView1.CurrentRow == null)
                {
                    btn.Visible = false;
                    return;
                }
                else
                {
                    btn.Visible = true;
                }
                
                //判断滚动条是否存在,暂时未考虑
                if (this.dataGridView1.DisplayedRowCount(false) == this.dataGridView1.RowCount)
                    MyScroll.Height = 0;
                if (this.dataGridView1.DisplayedColumnCount(false) == this.dataGridView1.ColumnCount)
                    MyScroll.Width  = 0;
                //设置高度
                //设置按钮控件的高度
                btn.Height = this.dataGridView1.CurrentRow.Height;
                //设置top
                //计算btn的top
                int Top=this.dataGridView1.ColumnHeadersHeight;
                //判断列头是否显示
                if (!this.dataGridView1.ColumnHeadersVisible)
                {
                    Top = 0;
                }            
                //判断当前行是否已经被隐藏
                if (MyScroll.Height > this.dataGridView1.CurrentRow.Index)
                {
                    btn.Visible = false;
                    return;
                }
                else
                    btn.Visible = true;
                //循环相加各行的row的height
                for (int i = MyScroll.Height; i < this.dataGridView1.CurrentRow.Index; i++)
                    Top += this.dataGridView1.Rows[i].Height;
                btn.Top = Top;
                //设置left
                //计算btn.left
                int Left;
                if (this.dataGridView1.RowHeadersVisible)
                    Left = this.dataGridView1.RowHeadersWidth - btn.Width;
                else
                    Left = -btn.Width;
                //遍历判断提取display当前列前面的列宽
                for (int i = 0; i <= this.dataGridView1.Columns["Name"].DisplayIndex; i++)
                {
                    for (int j = 0; j <= this.dataGridView1.ColumnCount  - 1; j++)
                    {
                        if (this.dataGridView1.Columns[j].DisplayIndex == i && this.dataGridView1.Columns[j].Visible)
                        {
                            Left += this.dataGridView1.Columns[j].Width;
                            break;
                        }
                    }
                }
                btn.Left = Left-MyScroll.Width ;
                //判断btn的left是小于rowheader的右边界
                if (this.dataGridView1.RowHeadersWidth > btn.Left && this.dataGridView1.RowHeadersVisible)
                    btn.Visible = false;
            }
            private void dataGridView1_Scroll(object sender, ScrollEventArgs e)
            {
                //0为水平滚动,1为垂直滚动
                if (e.ScrollOrientation == 0)
                {
                    MyScroll.Width = e.NewValue;
                    this.dataGridView1_CellEnter(null, null);
                }
                else
                {
                    MyScroll.Height = e.NewValue;
                    this.dataGridView1_CellEnter(null, null);
                }
            }        private void dataGridView1_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
            {
                //调用过程
                this.dataGridView1_CellEnter(null,null);
            }        /// <summary>
            /// 列宽变化事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
            {
                this.dataGridView1_CellEnter(null, null);
            }        /// <summary>
            /// 行高变化事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_RowHeightChanged(object sender, DataGridViewRowEventArgs e)
            {
                this.dataGridView1_CellEnter(null, null);
            }
            /// <summary>
            /// 列标题高度变化事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_ColumnHeadersHeightChanged(object sender, EventArgs e)
            {
                this.dataGridView1_CellEnter(null, null);
            }
            /// <summary>
            /// 行头宽度变化事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_RowHeadersWidthChanged(object sender, EventArgs e)
            {
                this.dataGridView1_CellEnter(null, null);
            }
            /// <summary>
            /// datagridview大小变化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dataGridView1_Resize(object sender, EventArgs e)
            {
                this.dataGridView1_CellEnter(null, null);
            }
            #endregion
      

  3.   

    也可以用这种DataGridViewComboBoxCell单元格对象赋给当前单元格来做,这种方法比较适合你的情况
    而且又简单
      

  4.   

    http://topic.csdn.net/u/20110219/18/e146cbc0-d45e-452c-adfa-1a5c236953db.html
      

  5.   

     在Datagridview控件利用下拉菜单进行枚举数据输入 
    http://blog.csdn.net/etudiant6666/archive/2011/03/05/6225890.aspx
      

  6.   

    各位我的是vs2003没有datagridview。只有DataGrid。