16

Visual Studio 2012 ulti を使用して WPF C#.NET4.5 を使用します。

古い winforms コード:

foreach (DataGridViewRow paretoRow in ParetoGrid.Rows)
{
       if ((Convert.ToInt32(paretoRow.Cells["CurrentPareto"].Value) < (Convert.ToInt32(paretoRow.Cells["NewPareto"].Value))))
       {
              paretoRow.Cells["pNew"].Value = downArrow
       }
}

循環する各行を見るとわかるように、特定のセルをチェックし、true の場合は別のセルに入力します。これは私が以前に何度も使用した古き良きwinformsコードでした...しかし。WPF への切り替えは、私が以前に想定していたよりもはるかに異なっていました。

DataGridRowプロパティが含まれていません。代わりに、次を使用する必要があると思います。

DataGridRow paretoRow in paretogrid.Items

しかし、私はまだ誰がセルを取得するかについて途方に暮れています.

だから私の質問は、実行する構文の変更はありますか?もしそうならどこで? または、WPFのデータグリッドはwinformsよりもオブジェクトで動作するため、「行」と呼ばれるプロパティを使用する必要がないと信じ始めているので、この例でどのロジック/構文を使用する必要がありますか?

皆さんの忍耐に感謝します。銀行の休日に家に帰ったら、WPF を少し掘り下げて、実際の違いを確認してみます。

4

7 に答える 7

28

最初にあなたがやりたいと思うのは、あなたのすべての行を取得することだと思いますDataGrid:

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;
    }
}

次に、グリッドを反復処理します。

var rows = GetDataGridRows(nameofyordatagrid); 

foreach (DataGridRow row in rows)  
{  
  DataRowView rowView = (DataRowView)row.Item;
  foreach (DataGridColumn column in nameofyordatagrid.Columns)
  {
      if (column.GetCellContent(row) is TextBlock)
      {
          TextBlock cellContent = column.GetCellContent(row) as TextBlock;
          MessageBox.Show(cellContent.Text);
      }
  } 
于 2013-03-28T16:19:13.033 に答える
1

はい、あなたは正しいです。WPFDataGridは、オブジェクトの使用をより適切にサポートするように構築されています。

次のような ViewModel を使用できます。それらをすべてコレクションに組み込み、そのコレクションを として設定しますItemsSource。また、pNew のチェックマークが true/false である代わりに画像を表示したい場合は、ValueConverter を使用する必要があります。

public class FooViewModel : INotifyPropertyChanged
{
    private int currentPareto;
    public int CurrentPareto 
    {
        get
        {
           return currentPareto;
        }
        set
        { 
            if (currentPareto == value)
                return;

            currentPareto = value;
            OnPropertyChanged("CurrentPareto");
            OnPropertyChanged("pNew");
        }
    }

    private int newPareto;
    public int NewPareto 
    {
        get
        {
           return newPareto;
        }
        set
        { 
            if (newPareto == value)
                return;

            newPareto = value;
            OnPropertyChanged("NewPareto");
            OnPropertyChanged("pNew");
        }
    }

    public bool pNew
    {
        get
        {
            return CurrentPareto < NewPareto;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

編集

少し単純化するために、基本 ViewModel クラスを使用してPropertyChangedウィービングを使用できます。コードは次のように簡略化されます。

public class FooViewModel : ViewModelBase
{
    public int CurrentPareto { get; set; }
    public int NewPareto { get; set; }
    public bool pNew { get { return CurrentPareto < NewPareto; } }
}
于 2013-03-28T16:35:53.190 に答える
0

WPF では、より動的で ObjectOrientated になります。に配置した要素のプロパティに列「pNew」をバインドできDataGridます。これは downarrow を返します。値が変更された場合、イベントPropertyChanged(Interface INotifyPropertyChanged) を発生させることができ、バインドされたプロパティが再評価されます。

また、WPF を始めるにあたって興味深いのはDataTemplate, ControlTemplate, Converter. コンバーターは、プロパティが呼び出されると、プロパティ値を WPF で使用可能な値 (BoolToVisibility など) に変更します。 DataTemplateコントロールの外観を変更するためにControlTemplate使用できます。

WPF の優れたチュートリアルがいくつかあります。また、MVVM-Pattern を調べて、Businessobject と WPF-Control の間のレイヤーとして使用することをお勧めします。特に、ここでやろうとしているようなことを処理するために。

于 2013-03-28T16:21:25.560 に答える
-4

このプロパティを使用して行数を取得し、For ループを使用して反復できないのはなぜですか?

dataGridView1.Rows.Count
于 2014-12-28T08:42:09.480 に答える