我以前用VB做过,我想C#方法也应该一样。就是生成一个Button对象(也可以先在表单中加入一个button按钮,然后设置其可见状态visible为false,使用的时候再让其可见),然后设置该Button的起始x,y坐标等于DataGrid的cell的起始x,y.Button的高度和宽度也设为cell的高度和宽度。如此就可以了!看上去cell变成了buttons!试试吧!

解决方案 »

  1.   

    在窗体的Load事件里面Button bt = new Button();
    bt.Visible=false;在DataGrid的MouseDown事件里:
    bt.Visible=true;
    DataGrid.Controls.Add(bt);
    bt.BringtoFront();
    然后还要一些附属条件:
    bt的起始x,y坐标等于目标Cell的起始x,y.Button的高度和宽度也设为Cell的高度和宽度。
      

  2.   

    我说的在DataGrid的MouseDown事件里写下面的语句,
    是想在你鼠标点下的时候,相应的按钮出现,如果楼主一直要该BUTTON出现
    那就在窗体的Load事件里全部添加完毕就是了!
      

  3.   

    现在datagrid上加上列,然后点右键,会出现Coluns[0]然后再编辑就好了!!!
      

  4.   

    1.继承DataGridColumnStyle
    2.this.TextBox.Controls.Add(new Button())
      

  5.   

    private Button button1;
    private void Form1_Load(object sender, System.EventArgs e)
    {
    this.sqlDataAdapter1.Fill(this.dataSet11);
    button1 = new Button();
    button1.Hide();
    this.dataGrid1.Controls.Add(button1);
    } private void dataGrid1_CurrentCellChanged(object sender, System.EventArgs e)
    {
    if(dataGrid1.CurrentCell.ColumnNumber ==1)
    {
    button1.Show();
    button1.BringToFront();
    button1.Location=dataGrid1.GetCellBounds(dataGrid1.CurrentCell.RowNumber,dataGrid1.CurrentCell.ColumnNumber).Location;
    button1.Width=dataGrid1.GetCellBounds(dataGrid1.CurrentCell.RowNumber,dataGrid1.CurrentCell.ColumnNumber).Width;
    button1.Height=dataGrid1.GetCellBounds(dataGrid1.CurrentCell.RowNumber,dataGrid1.CurrentCell.ColumnNumber).Height;

    } }
    }
    }
      

  6.   

    谢谢各位大虾的参与,但问题的关键是在拉动滚动条的时候怎么办?以上说到的添加方法都是将button作为一个控件而不是作为DataGrid的一部分添加的,是可以做到,但如果有滚动条的话则会出现很多问题,如Button出现在了DataGrid的边界时,如何隐藏Button的一半而又显示它的一半呢?
      

  7.   

    那就用datagridtextboxcolumn
    参见http://www.csharphelp.com/archives/archive151.html
    这个例子是加的combobox但原理相同,你看看!
      

  8.   

    你的分确实算不上高分.Public Class DataGridButtonColumn
        Inherits DataGridTextBoxColumn
        Public ColumnButton As Button
        Public IsShowButtonOnNewRow As Boolean  '仅新行时显示按钮
        Event ButtonShowing(ByVal cmd As Button, ByVal ColMapName As String, ByVal rowNum As Integer, ByRef IsShow As Boolean)    Shared Sub New()
            'Warning: Implementation not found
        End Sub
        Public Sub New()
            MyBase.New()        Me.ColumnButton = New Button()
            Me.ColumnButton.Text = "…"
            AddHandler Me.TextBox.VisibleChanged, AddressOf textbox_VisibleChanged
        End Sub    Protected Overloads Overrides Sub Edit(ByVal source As CurrencyManager, ByVal rowNum As Integer, ByVal bounds As Rectangle, ByVal readOnly1 As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
            MyBase.Edit(source, rowNum, bounds, readOnly1, instantText, cellIsVisible)
            If Not IsShowButtonOnNewRow AndAlso (Me.ReadOnly OrElse Me.DataGridTableStyle.ReadOnly OrElse Me.DataGridTableStyle.DataGrid.ReadOnly) Then
                ColumnButton.Visible = False
                Return
            End If        '客户程序可控告制显示按钮否
            Dim IsShow As Boolean = True
            RaiseEvent ButtonShowing(ColumnButton, Me.MappingName, rowNum, IsShow)
            If IsShow = False Then
                ColumnButton.Visible = False
                Return
            End If        If Me.IsShowButtonOnNewRow Then '仅新行显示按钮
                If TypeOf source.Current Is DataRowView Then
                    Dim row As DataRowView = CType(source.Current, DataRowView)
                    If row.Row.RowState <> DataRowState.Detached Then
                        ColumnButton.Visible = False
                        Return
                    End If
                End If
            End If        If Me.TextBox.Visible Then
                ColumnButton.Parent = Me.TextBox.Parent
                ColumnButton.Size = New Size(Me.TextBox.Height + 5, Me.TextBox.Height + 2)
                ColumnButton.Location = New Point(Me.TextBox.Location.X + Me.TextBox.Width - _
                    Me.ColumnButton.Width - 1, TextBox.Location.Y - 2)            ColumnButton.Visible = True
                ColumnButton.BringToFront()
            Else
                Me.ColumnButton.Visible = False
            End If
        End Sub
        Protected Overloads Overrides Function Commit(ByVal dataSource As CurrencyManager, ByVal rowNum As Integer) As Boolean
            If ColumnButton.Visible Then ColumnButton.Visible = False
            Return MyBase.Commit(dataSource, rowNum)
        End Function
        Private Sub textbox_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
            If Me.TextBox.Visible = False Then Me.ColumnButton.Visible = False
        End Sub
    End Class