2017-09-21 15 views
0

私はWPFを初めて使用しており、時間を節約するための簡単なツールを構築するための基本的なことを学びたいと考えています。ここでは、リモートファイルを読み込んでステータスを取得し、マシンの名前とファイルのステータスでDataGridを更新しようとしています。WPF - ObserableCollectionsを使用してDataGridの新しい行の代わりに既存のROW値を更新する

以下

は、CSコードです:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<User> users = new ObservableCollection<User>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     lbUsers.ItemsSource = users; 
    } 

    private void btnCheckStatus_Click(object sender, RoutedEventArgs e) 
    { 
     var fileStream_status = new FileStream(@"\\LBSTR\c$\temp\range.dat", FileMode.Open, FileAccess.Read); 
     using (var streamReader = new StreamReader(fileStream_status, Encoding.UTF8)) 
     { 
      string line; 
      while ((line = streamReader.ReadLine()) != null) 
      { 
       if (line.Equals("A")) 
       { 
        users.Add(new User() { MachineName = "LBSTR", Status = "Close" }); 
       } 
       else if (line.Contains("B")) 
       { 
        users.Add(new User() { MachineName = "LBSTR", Status = "Open" }); 
       } 
      } 
     } 
    } 
} 

public class User 
{ 
    public string MachineName {set;get;} 
    public string Status {set;get;} 
} 

XAML:私はチェックステータスをクリックすることで、初めてを実行すると

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DockPanel Margin="10"> 
     <StackPanel DockPanel.Dock="Right" Margin="10,0,0,0"> 
      <Button Name="btnCheckStatus" Click="btnCheckStatus_Click">Check Status</Button> 

     </StackPanel> 
     <DataGrid Name="lbUsers" ></DataGrid> 
    </DockPanel> 
</Grid> 

、行は、マシン名を追加取得して、ファイルの状態 For a first click

2回目に同じボタンをクリックすると、同じマシンに対して新しい行が追加されます。

Further Check status

この方法は私がリモートマシンにあるファイルのステータスをチェックするたびに新しい行を作成しているので、私はちょうど私が対応するマシン名に一人でステータスを更新することができます方法を知りたい

。?ソリューションの特定に役立つ方法やオンラインの記事があれば教えてください。だから、

+0

を?既存の行を見つけて更新するためにコード内に何も表示されません。毎回Addを呼び出すだけです。 –

+0

あなたはあなたの質問にすでに何をする必要があるのか​​を記述しています。更新しようとしているアイテムが存在する場合はObservableCollectionで見つけてください。存在する場合はそのアイテムのステータスを変更してください。今はそれをコーディングすることです。したがって、 'users.Add()'の代わりに、 'users'が問題の項目を持っているかどうか最初にチェックし、そうであればリストに追加するのではなく単に更新してください。 – Sach

答えて

0

サックスはこのような何かにあなたのbtnCheckStatus_Clickを変更し、言ったように:この行こと

private void BtnCheckStatus_Click(object sender, RoutedEventArgs e) 
    { 
     var fileStreamStatus = new FileStream(@"\\LBSTR\c$\temp\range.dat", FileMode.Open, FileAccess.Read); 
     using (var streamReader = new StreamReader(fileStreamStatus, Encoding.UTF8)) 
     { 
      string line; 
      while ((line = streamReader.ReadLine()) != null) 
      { 
       var user = new User { MachineName = "LBSTR" }; 

       if (line.Equals("A")) 
        user.Status = "Close"; 

       else if (line.Contains("B")) 
        user.Status = "Open"; 

       var existingUser = _users.FirstOrDefault(u => u.MachineName.Equals(user.MachineName)); 

       if (existingUser != null) 
       { 
        existingUser.Status = user.Status; 
        return; 
       } 

       _users.Add(user); 
      } 
     } 
    } 

注:

var existingUser = _users.FirstOrDefault(u => u.MachineName.Equals(user.MachineName)); 

はO(n)が複雑です。したがって、非常に頻繁に実行する必要がある場合は、単純なObservableCollectionの代わりにハッシュコレクションを考慮する必要があります。

もDataGridCellため

は値を更新でき - あなたのUserクラスは、このようなINotifyPropertyChangedのインタフェースを実装する必要がありますあなたがこれまでに試してみました何

public class User : INotifyPropertyChanged 
{ 
    private string _machineName; 
    private string _status; 

    public string MachineName 
    { 
     set 
     { 
      if (!value.Equals(_machineName)) 
      { 
       _machineName = value; 
       NotifyPropertyChanged(); 
      } 
     } 
     get { return _machineName; } 
    } 

    public string Status 
    { 
     set 
     { 
      if (!value.Equals(_status)) 
      { 
       _status = value; 
       NotifyPropertyChanged(); 
      } 
     } 
     get { return _status; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Tarasに感謝します。それはうまくいった。あなたが気にしない場合は、OpenとGreenのようにStatus列に色を追加するにはどうすればいいですか?私は検索し、ほとんどの例はXAML(DataGridTextColumn)の助けを借りていますが、ここでは既にUserクラスの助けを借りて作成された列です。 – Siva

+0

それはあなたを助けたことを貪欲に、受け入れられたとして答えをマークすることを忘れないでください。私はあなたのさらなる問題についてお手伝いすることができますが、このトピックに関連していないので、私はここにコードを掲載すべきではありません。あなたは基本的に、そのコンバーターを使ってあなたのStatusプロペラにバインドされたバックグラウンドプロパティ用の1つのセッターだけで、あなたの文字列値をブラシと非常に単純なDataGridCellスタイルに変換するために、ある種のStatusToBrushConverter(IValueConverterを実装しています) – Taras

+0

Tarasに感謝します。私はそれを考え出した。私はUpVoteを2回以上行うことができたが、私はあなたに名誉を与える評判はないので、私はできなかった。どのようにこれについてあなたの助けに感謝。 – Siva

関連する問題