3

我有下一个代码,我在其中定义了一个名为 dgQuery 的 WPF 工具包数据网格控件;我用数据集的信息填充了这个,然后我在 dgQuery 中插入了一个新的复选框列来检查/取消选中一些行,我显示了我的 C# 代码的一部分:

dgQuery.DataContext = dS.Tables[0];

DataGridTemplateColumn cbCol = new DataGridTemplateColumn();
cbCol.Header = "Opc";
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CheckBox));
Binding bind = new Binding("IsSelected");
bind.Mode = BindingMode.TwoWay;
factory.SetValue(CheckBox.IsCheckedProperty, bind);
DataTemplate cellTemplate = new DataTemplate();
cellTemplate.VisualTree = factory;
cbCol.CellTemplate = cellTemplate;
dgQuery.Columns.Insert(0, cbCol);

在选中/取消选中 dgQuery 行的新复选框列后,我将单击一个按钮以仅将我选中的行保存到数据库中。问题是,如何开发循环来读取 dgQuery 的所有行以及让我知道哪些行选中/取消选中复选框的条件?请帮我举个例子。

谢谢!!

4

4 回答 4

11

这将在您的数据网格中返回一个“行”

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid)
    {
        var itemsSource = grid.ItemsSource as IEnumerable;
        if (null == itemsSource) yield return null;
        foreach (var item in itemsSource)
        {
            var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow;
            if (null != row) yield return row;
        }
    }

在 wpf 数据网格中,行是 ItemSource.items... 没有 Rows 属性!

希望这可以帮助...

于 2009-12-20T00:28:58.023 回答
1
 var row = GetDataGridRows(dataGrid1);
 /// go through each row in the datagrid
            foreach (Microsoft.Windows.Controls.DataGridRow r in row)
            {
                DataRowView rv = (DataRowView)r.Item;

                // Get the state of what's in column 1 of the current row (in my case a string)
                string t = rv.Row[1].ToString();


            }
于 2009-12-20T16:22:45.210 回答
1

不确定这是否有用,因为它采用与您开始时不同的方法,但您可以将其绑定到具有每列属性的对象的 ObservableCollection 上,而不是直接使用网格。如果在对象中为“Selected”添加一个 bool 属性并将复选框列绑定到它,则可以随时查询集合以获取当前选择的内容,如下所示:

 List<MemberEntity> selectedItems = 
            new List<MemberEntity>(from memberEntity in _memberEntities 
                                   where memberEntity.Selected == true 
                                   select memberEntity);

        //now save selectedItems to the database...

因此 MemberEntity 是一个类,它对网格中的每一列都有一个属性,包括一个名为 Selected 的布尔值,用于复选框列。_memberEntities 是 MemberEntity 实例的 ObservableCollection。网格的 ItemSource 属性绑定到 _memberEntities,并且它的每个列的 Binding 属性都绑定到 MemberEntity 中的一个属性,如下所示,假设 Selected 和 Name 是 MemberEntity 中的属性:

<tk:DataGrid ItemsSource="{Binding _memberEntities}">
        <tk:DataGrid.Columns>
            <tk:DataGridCheckBoxColumn Binding="{Binding Path=Selected}" />
            <tk:DataGridTextColumn Binding="{Binding Path=Name}" />
        </tk:DataGrid.Columns>
</tk:DataGrid>
于 2009-12-20T16:32:01.457 回答
0
//Looping thought datagrid rows & loop though cells and alert cell values

var row = GetDataGridRows(DataGrid_Standard);
/// go through each row in the datagrid 
foreach (Microsoft.Windows.Controls.DataGridRow r in row)
{
    DataRowView rv = (DataRowView)r.Item;
    foreach (DataGridColumn column in DataGrid_Standard.Columns)
    {
        if (column.GetCellContent(r) is TextBlock)
        {
            TextBlock cellContent = column.GetCellContent(r) as TextBlock;
            MessageBox.Show(cellContent.Text);
        }
        else if (column.GetCellContent(r) is CheckBox)
        {
            CheckBox chk = column.GetCellContent(r) as CheckBox;
            MessageBox .Show (chk.IsChecked.ToString());
        }                      
    }
} 

public IEnumerable<Microsoft.Windows.Controls.DataGridRow> GetDataGridRows(Microsoft.Windows.Controls.DataGrid grid)
{
    var itemsSource = grid.ItemsSource as IEnumerable;
    if (null == itemsSource) yield return null;
    foreach (var item in itemsSource)
    {
        var row = grid.ItemContainerGenerator.ContainerFromItem(item) as Microsoft.Windows.Controls.DataGridRow;
        if (null != row) yield return row;
    }
}
于 2010-07-01T12:35:51.013 回答