【问题标题】:Adding a button to a Winforms DataGridView向 Winforms DataGridView 添加按钮
【发布时间】:2011-12-16 13:04:55
【问题描述】:

有没有办法在 C# 中向 Winforms DataGridView 单元格添加控件(例如按钮)?

(我的目标是将各种控件放在网格的不同单元格中......)

【问题讨论】:

标签: c# winforms datagridview


【解决方案1】:

你可以这样做......

有两种方法可以做到这一点:

  • 1)。将 DataGridViewCell 转换为存在的特定单元格类型。为了 例如,将 DataGridViewTextBoxCell 转换为 DataGridViewComboBoxCell 类型。
  • 2)。创建一个控件并将其添加到控件集合中 DataGridView,设置它的位置和大小以适合要成为的单元格 主持人。

请参阅下面的示例代码,其中说明了这些技巧。

代码片段

    private void Form5_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("name");
        for (int j = 0; j < 10; j++)
        {
            dt.Rows.Add("");
        }
        this.dataGridView1.DataSource = dt;
        this.dataGridView1.Columns[0].Width = 200;

        /*
         * First method : Convert to an existed cell type such ComboBox cell,etc
         */

        DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell();
        ComboBoxCell.Items.AddRange(new string[] { "aaa","bbb","ccc" });
        this.dataGridView1[0, 0] = ComboBoxCell;
        this.dataGridView1[0, 0].Value = "bbb";

        DataGridViewTextBoxCell TextBoxCell = new DataGridViewTextBoxCell();
        this.dataGridView1[0, 1] = TextBoxCell;
        this.dataGridView1[0, 1].Value = "some text";

        DataGridViewCheckBoxCell CheckBoxCell = new DataGridViewCheckBoxCell();
        CheckBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
        this.dataGridView1[0, 2] = CheckBoxCell;
        this.dataGridView1[0, 2].Value = true;

        /*
         * Second method : Add control to the host in the cell
         */
        DateTimePicker dtp = new DateTimePicker();
        dtp.Value = DateTime.Now.AddDays(-10);
        //add DateTimePicker into the control collection of the DataGridView
        this.dataGridView1.Controls.Add(dtp);
        //set its location and size to fit the cell
        dtp.Location = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Location;
        dtp.Size = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Size;
    }

【讨论】:

  • 虽然第二种方法确实显示了控件,但当单元格滚动时它保持静态 - 有没有办法将新控件锁定到底层单元格?
  • 第一种方法效果很好,第二种方法会导致控件在滚动时“掉出”网格。我想您可以使用格式事件将其再次移回。
【解决方案2】:

DataGridViewButtonColumn 是提供的包含可单击按钮的列类型。您可以将自己的控件添加到单元格中:

http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

请记住,这并不总是微不足道的,但我看到有人将整个 DataGridView 放入一个单元格 - 看起来很奇怪。

还有其他提供的栏目:

DataGridViewButtonColumn
DataGridViewCheckBoxColumn
DataGridViewComboBoxColumn
DataGridViewImageColumn
DataGridViewLinkColumn
DataGridViewTextBoxColumn

您可以在 Visual Studio 的设计器中的列编辑器中更改这些,或在代码中将它们添加到 Columns 集合中。

【讨论】:

  • 啊,你是说我可以在 DataGridViewButtonColumn 中添加任何类型的控件?当我偶然发现这一点时,我认为这是一个充满按钮的列;-)
  • @Boris 否,不要添加到按钮列,您可以创建一个承载任何控件的列类型并将该列类型添加到网格中。例如,您可以创建一个承载 NumericUpDown 控件的 DataGridViewNumericUpDownColumn。该列被编码以承载特定的控件类型,这不是运行时决定。
  • 但是我觉得还是有一个误区:用这种方式,是不是整个列都得到了同类型的控制?因为我想在每个单元格中拥有不同类型的控件。
  • 是的,在这种方法中,整列都得到它,因为通常整列在网格中包含相同的数据类型。我没有见过,也不知道允许单个单元格包含不同编辑控件的解决方案。
  • @Boris 实际上,您可以定义一个 DataGridViewPanelColumn,它能够根据您的需要向面板添加和删除子控件。但不一定是最干净或最简单的方法。
【解决方案3】:

我会在设计器中添加它并制作一个模板字段。简单的方法去把你想要的任何东西放在datagridview中

例子

<asp:DataGrid ID="somedatagrid" runat="server">
    <Columns>
        <asp:TemplateColumn>
            <ItemTemplate>
                <asp:Button ID="somebutton" runat="server" Text="some button" />
            </ItemTemplate>
        </asp:TemplateColumn>
    </Columns>
</asp:DataGrid>

【讨论】:

  • 不幸的是,问题是关于 winforms,而不是 .NET 网页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 2012-05-13
  • 2017-08-15
  • 2018-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多