2017-03-28 13 views
0

コールシステムからデータを収集し、ビルドしているGUIに表示するためのバックエンドインターフェイスが提供されました。私はこれを初めて学び、それを学習プロジェクトとして使用しています。 1つの巨大な文字列ではなく、いくつかのデータをリストにフィルタリングしようとしています。以下は、テキストブロックにデータを表示するために使用しているコードです。変数の出力をリスト形式に整形するのに役立つ必要があります。

public void OnMessageReceived(object sender, MessageReceivedEventArgs e) 
{ 
    try 
    { 
     if (e == null) 
      return; 

     if (e.CmsData != null) 
     { 
      Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
      { 
       foreach (var item in e.CmsData.Agents) 
       { 
        List<string> mylist = new List<string>(); 
        mylist.Add(item.AuxReasonDescription); 

       } 
       textBlock.Text = string.Join(Environment.NewLine, e.CmsData.Agents); }));     
     }    
    } 
    catch (Exception ex)  
} 

あなたは私のtextBlock.Textで見ることができるように私はEnvironment.NewLineに次の変数mylistを置くことができるように期待していたが、変数を見つけることができませんでした。

以下は、これを理解する必要がある場合にリストを取得する.CSファイルです。

通常、これは、以下にリストされていないインターフェイスから供給されているすべてのログインしているエージェントのリストを表示します。私はこれを作ろうとしているので、各エージェントには以下のagent.csファイルのデータフィールドを含む列があります。私はこれを完全な間違った方向に向けるかもしれない。提供されるどんな援助も感謝されるでしょう。

public class Agent : IEquatable<Agent> 
{ 
    public int Extension { get; set; } 
    public int WorkModeDirection { get; set; } 
    public string WorkModeDirectionDescription { get; set; } 
    public TimeSpan AgTime { get; set; } 
    public int AuxReason { get; set; } 
    public string AuxReasonDescription { get; set; } 
    public int DaInQueue { get; set; } 
    public int WorkSkill { get; set; } 
    public int OnHold { get; set; } 
    public int Acd { get; set; } 
    public String LoginId { get; set; } 
    public string AgName { get; set; } 
    public int EId { get; set; } 
    public int Preference { get; set; } 
    public DateTime DateTimeCreated { get; set; } 
    public DateTime DateTimeUpdated { get; set; } 
    public int CmId { get; set; } 
    #region Implementation of IEquatable<Agent> 

    public bool Equals(Agent other) 
    { 
     if (ReferenceEquals(null, other)) 
      return false; 

     if (ReferenceEquals(this, other)) 
      return true; 

     return (other.LoginId == LoginId & other.CmId == CmId); 
    } 

    #endregion 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) 
      return false; 

     if (ReferenceEquals(this, obj)) 
      return true; 

     if (obj.GetType() != typeof(Agent)) 
      return false; 

     return Equals((Agent)obj); 
    } 

    //public override int GetHashCode() 
    //{ 
    // return LoginId; 
    //} 
    public override int GetHashCode() 
    { 
     string combinedNumber = "" + CmId + LoginId; 
     int hash = Convert.ToInt32(combinedNumber); 
     return hash; 
    } 

    public static bool operator ==(Agent left, Agent right) 
    { 
     return Equals(left, right); 
    } 

    public static bool operator !=(Agent left, Agent right) 
    { 
     return !Equals(left, right); 
    } 

    public override string ToString() 
    { 
     return " Ag: [Ext:" + Extension + " login:" + LoginId + " AgName:" + AgName + " CmId:" + CmId + "]"; 
    } 
    public bool IsValid() 
    { 
     return LoginId != null; 
    } 
} 
+0

プラス1あなたは少なくともこの質問に投票する人に投票する前にコメントをする必要があります – tabby

答えて

0

あなたは内部myListforeachループを宣言しました。コンパイラはtextBlock.Textを設定したいときにそれをもう知りません。さらに悪いことに、毎回の新しいリストを作成することになります。

単にforeach外の宣言を移動:

List<string> mylist = new List<string>(); 
foreach (var item in e.CmsData.Agents) 
{ 
    mylist.Add(item.AuxReasonDescription); 
} 
textBlock.Text = string.Join(Environment.NewLine, myList); 

またはLINQを使用して:

// no extra list and foreach needed 
textBlock.Text = string.Join(Environment.NewLine, 
          e.CmsData.Agents.Select(item => item.AuxReasonDescription)); 

e.CmsData.AgentsIEnumerable<Agent>を実装する場合(これはのみ動作し、それが唯一あなたが非ジェネリックIEnumerableを実装している場合」。追加する必要がありますe.CmsData.Agents.OfType<Agent>.Select...)。


しかし、メッセージハンドラ内の文字列を構築する方が良いかもしれUIスレッド上でそれを行うよりも、(とメッセージを受け取るスレッド上):

if (e.CmsData != null) 
{ 
    string text = string.Join(Environment.NewLine, 
          e.CmsData.Agents.Select(item => item.AuxReasonDescription)); 
    Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => 
    { 
     textBlock.Text = text;     
    } 
} 
+0

これは素晴らしいです。私は実際に私のオリジナルフォーマットにこだわりました。それは私がちょうどキャッチしていない簡単な間違いだったのでうれしい。私は最近それらの多くを作っているようだ。 string.formatを使用してデータの列をデータの列に変換するのではなく、単にダンプするだけです。簡単に手助けできますか、新しい質問を投稿する必要がありますか? – mcavanaugh418

+0

@ mcavanaugh418これは新しい質問とよく似ていますが、私はすでに退職しています(私の電話から今書いていますので、今後12時間以内に回答しません)。あなたがこの質問を解決した場合、あなたはこの回答を受け入れたものとしてマークすることができます。 –

関連する問題