将新列中的按钮添加到 DataGrid 中的所有行



我有一个DataGridView对象:

dataGridView1.DataSource = an.peaks;

(an.peaks是一个List<Point>对象。 Point类型有 3 个属性:x,y,z)

女巫在运行时生成下一个表:(显然我还不能上传Image因为我是新用户,所以我会尝试将其绘制:)

____|_x__|_y__|_z__|[new column ]
____|_11_|_12_|_13_|[text/button] <==
____|_20_|_30_|_40_|[text/button] <== } Add text if something or button if something else.
____|_50_|_60_|_70_|[text/button] <==/

我想在满足某些条件的每一行的新列中添加按钮(如图像/绘图所示)。如果不满足条件,请添加一些文本。

示例:如果数据库中已存在该点,则显示其物质名称(每个点代表一种物质)。如果没有,请将按钮"ADD"添加到相应的行中,该行会将新点添加到数据库中。

条件不是问题——它们只是例子。问题是将按钮/文本添加到每一行以及新按钮的单击事件。

使用DataGridView实际上非常简单。您需要做的是:

添加数据类型为"数据网格视图按钮列"的列

DataGridViewButtonColumn是标准的DataGridView列类型。它可以通过设计器添加,但我通常更喜欢使用代码(通常在表单构造函数中)。

DataGridViewButtonColumn col = new DataGridViewButtonColumn();
col.UseColumnTextForButtonValue = True;
col.Text = "ADD";
col.Name = "MyButton";
dataGridView1.Columns.Add(col);

设置为 true UseColumnTextForButtonValue意味着 Text 属性将应用于所有按钮,为其提供"ADD"按钮文本。还可以使用 DataPropertyName 指向网格数据源中的列以提供按钮文本,甚至可以直接设置每个单元格的值。

将按钮更改为文本

获得按钮列后,您希望将特定按钮转换为文本。为此,您可以将按钮类型的单元格替换为文本类型的单元格之一。您可以在很多地方执行此操作,但最好的位置之一是在 DataBindingComplete 事件处理程序中 - 一旦网格绑定并准备好显示,但在绘制之前,此事件将触发。

下面我只是抓取索引为 1 的行,但您也可以检查属性Value的每一行。

void dataGridView1_DataBindingComplete(object sender,
    DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.Rows[1].Cells["MyButton"] = new DataGridViewTextBoxCell();
}

响应按钮点击

问题的最后一部分是对按钮单击的响应。这有点笨拙 - 您需要对整个网格使用 CellClick 事件或 EditingControlShowing 事件。

  • 单元格点击

    private void DataGridView1_CellClick(object sender,
        System.Windows.FormsDataGridViewCellEventArgs e) 
    { 
        if (DataGridView1.Columns[e.ColumnIndex].Name == "MyButton") 
        { 
            // button clicked - do some logic
        } 
    }
    
  • 编辑控件显示

    void dataGridView1_EditingControlShowing(object sender,
         DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is Button)
        {
            Button btn = e.Control as Button;
            btn.Click -= new EventHandler(btn_Click);
            btn.Click += new EventHandler(btn_Click);
        }
    }
    void btn_Click(object sender, EventArgs e)
    {
        int col = this.dataGridView1.CurrentCell.ColumnIndex;
        int row = this.dataGridView1.CurrentCell.RowIndex;
        // Rest of the logic goes here!
    } 
    

在您的情况下,编辑控件方法可能是最好的,因为它不会响应单击已替换为文本的按钮。此外,这种方式更像是您对表单上任何其他按钮的响应方式。

可以将 WPF 宿主控件添加到 WinForms 项目中,并将 DataGrid 与 CellTemplateSelector 一起使用。例如:

<DataGrid x:Name="grid" AutoGenerateColumns="False" x:FieldModifier="private">
  <DataGrid.Resources>
    <local:PointDataTemplateSelector x:Key="pointDataTemplateSelector" />
    <DataTemplate x:Key="buttonTemplate">
      <Button Click="OnAddButtonClick" Tag="{Binding Mode=OneWay}">Add</Button>
    </DataTemplate>
    <DataTemplate x:Key="textTemplate">
      <TextBlock>Exists</TextBlock>
    </DataTemplate>
  </DataGrid.Resources>
  <DataGrid.Columns>
    <DataGridTextColumn Header="X" Binding="{Binding X}" />
    <DataGridTextColumn Header="Y" Binding="{Binding Y}" />
    <DataGridTemplateColumn Header="Select" CellTemplateSelector="{StaticResource pointDataTemplateSelector}"></DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

和选择器类:

public class PointDataTemplateSelector : DataTemplateSelector {
    public override DataTemplate SelectTemplate(object item, DependencyObject container) {
        var element = container as FrameworkElement;
        if (element != null && item != null && item is Point) {
            var point = (Point)item;
            // Logic here.
            if (point.X >= 5) {
                return element.FindResource("buttonTemplate") as DataTemplate;
            }
            return element.FindResource("textTemplate") as DataTemplate;
        }
        return null;
    }
}

它可能比WinForms更容易。

最新更新