Как зациклить строки набора инструментов WPF Datagrid - PullRequest
3 голосов
/ 20 декабря 2009

У меня следующий код, в котором я определил элемент управления сеткой данных инструментария WPF с именем dgQuery; Я заполнил это информацией о наборе данных, затем вставил новый столбец флажка в 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 ]

11 голосов
/ 20 декабря 2009

это вернет 'строку' в вашей таблице данных

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!

Надеюсь, это поможет ...

1 голос
/ 20 декабря 2009

Не уверен, что это полезно, поскольку он предполагает иной подход, чем тот, с которого вы начали, но вместо того, чтобы работать непосредственно с сеткой, вы можете привязать его к ObservableCollection объектов, которые имеют свойства для каждого столбца. Если вы добавите свойство 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 - это ObservableCollection экземпляров MemberEntity. Свойство ItemSource сетки привязано к _memberEntities, и каждое из свойств привязки ее столбца привязано к свойству в 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>
1 голос
/ 20 декабря 2009
 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();


            }
0 голосов
/ 01 июля 2010
//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;
    }
}
...