数据网格单元格行点击事件

3

我的 WPF DataGrid 看起来像这样:enter image description here

相关标记:

    <DataGrid x:Name="Processes" AutoGenerateColumns="False" ItemsSource="{Binding Path=ProcessesBinding}" HorizontalAlignment="Left" VerticalAlignment="Top" Height="200" Width="807" Margin="13,32,0,0">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path=Id}" Header="ID" Width="50" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Friendlyname}" Header="Name" Width="200" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Process}" Header="Process" Width="180" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Status}" Header="Status" Width="180" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Autostart}" Header="Auto Start" Width="100" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
            <DataGridTextColumn Binding="{Binding Path=Autorestart}" Header="Auto Restart" Width="100" CanUserResize="False" IsReadOnly="True"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

我填充数据的方式
foreach (var ... in ...)
{
    dataTable.Rows.Add(...);
}

以及如何应用

Processes.ItemsSource = dataTable.DefaultView;

我已经搜索了网络并找到了这篇文章,但是我没有找到我需要的内容。 我的要求: 无论我在第一行(上面的ID 13)的哪个位置单击,都会触发一个事件。我唯一需要的是被单击的行的ID,以便我可以进一步处理“请求”。
这就是我模糊地想到的。
private void CellClick(int ID) { // show new window with id
}
3个回答

2

datagrid中有一个名为MouseDoubleClick的事件。您可以像这样使用它来获取双击的整行对象。

private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (sender != null)
            {
                DataGrid grid = sender as DataGrid;
                if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1)
                {
                    DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow;
                    YourClass obj = dgr.Item as YourClass;
                    this.selectedIndex = grid.SelectedIndex;
                    int id = obj.ID;
                }
            }
        }

由于我不知道你的类名,所以你可以用你的类名替换YourClass

基本上这段代码是检测Datagrid的双击事件。然后它检查该事件是否在DataGridRow上执行。然后将该行的项目强制转换为您定义的类。该行的所有信息都将填充在您接收到的类型转换对象中。


1
如果您不采用MVVM方法,而是仅使用事件处理程序,则可以为所选单元格的更改添加处理程序:
<DataGrid SelectedCellsChanged="yourGrid_SelectedCellsChanged" ...>

在代码后台文件中。
 private void yourGrid_SelectedCellsChanged(object sender, System.Windows.Controls.SelectedCellsChangedEventArgs e)
    {
        // retrieve the id here, like in the answer above
    }

0
除了@UmairFarooq提出的建议之外,如果您有一个控件,比如说一个单元格中的按钮,另一种实现方式可以如下所示:
基本上,单元格中的控件将继承行数据对象的DataContext。我们称其为MyObject。因此,MyObject.ID就是您想要的内容。
private void Button_Click(object sender, MouseButtonEventArgs e)
{
     MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Now you can do whatever you wanted to do with MyObject.ID
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接