有个问题,就是要在DataGridView指定的单元格内使用指定的组件编辑该单元格的值,要求不能对其他的单元格产生影响,
网上大部分代码都是重写DataGridView的列和单元格模板,这样会导致整个列的单元格都受到影响刚在网上找到一段代码:
原文在这
http://www.dotblogs.com.tw/puma/archive/2008/11/10/5943.aspx
大体意思是,新建一个控件,该把该控件的坐标和大小设置了和单元格一样,显示这个控件后就会把单元格覆盖掉,选择了值后再把该控件隐藏我实验的代码using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Storage.Module;
namespace Storage.Forms
{
    public partial class TestForm : Form
    {
        DateTimePicker MyDateTimePicker = new DateTimePicker();
        DataTable Table = new DataTable();        public TestForm()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            Table = DatabaseManager.getDataSet("select * from Human").Tables[0];
            dataGridView1.DataSource = Table;
        }        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
               Rectangle r = this.dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);                  r = this.dataGridView1.RectangleToScreen(r);                 this.MyDateTimePicker.Location = this.RectangleToClient(r).Location;                  this.MyDateTimePicker.Size = r.Size;    
               //this.d.Text = this.dataGridView1.CurrentCell.Value.ToString();  
               this.MyDateTimePicker.Visible = true;  
        }
    }
}我的代码总是显示不了新建的控件,请问下应该怎么改

解决方案 »

  1.   

    CellContentClick 在单元格中的内容被单击时发生,貌似事件用的不对头
      

  2.   

    http://topic.csdn.net/u/20091118/22/bab1a71a-21e3-4495-9087-691eb8945c3f.html
      

  3.   

    感谢人生如梦
    只要加上dataGridView1.Controls.Add(MyDateTimePicker); 就行了
      

  4.   

    在窗体上加个 buttonDataTable table = new DataTable();
    table.Columns.AddRange(new DataColumn[] {
        new DataColumn("id"),
        new DataColumn("name"),
        new DataColumn("datetime")});for (int i = 0; i < 20; i++)
    {
        table.Rows.Add(new object[] {
            i, string.Format("value {0}",i), DateTime.Now});
    }this.dataGridView1.DataSource = table;
    this.dataGridView1.AutoGenerateColumns = true;DateTimePicker dtp = new DateTimePicker();
    dtp.Visible = false;this.dataGridView1.Controls.Add(dtp);this.dataGridView1.CellBeginEdit += (obj, args) =>
    {
        if (args.ColumnIndex == 2)
        {
            Rectangle rect =
                this.dataGridView1.GetCellDisplayRectangle(
                args.ColumnIndex, args.RowIndex, false);        dtp.SetBounds(rect.Left, rect.Y, rect.Width, rect.Height);
            dtp.Value = DateTime.Parse(
                this.dataGridView1.Rows[args.RowIndex]
                .Cells[args.ColumnIndex].Value.ToString());
            dtp.Visible = true;
        }
    };this.dataGridView1.CellEndEdit += (obj, args) =>
    {
        this.dataGridView1.Rows[args.RowIndex]
            .Cells[args.ColumnIndex].Value = dtp.Value;    dtp.Visible = false;
    };this.dataGridView1.ColumnWidthChanged += (obj, args) =>
    {
        if (dtp.Visible) dtp.Width = args.Column.Width;
    };