2017-10-12 5 views
1

私はxamarin.formsにシンプルなモバイルアプリを持っています。クリックすると、カメラを介してコードをスキャンするメソッドがトリガされます。スキャンされると、番号が取得されます。しかし、私はいくつかのコードをスキャンし、対応する番号を保存したい。したがって、スキャンごとに、ボタンをもう一度クリックしてスキャンします。次のようにC#でボタンをクリックしてもリストに項目を追加し続ける

私のコードは次のとおりです。

public async void StoreNum() 
{ 
    ListNumbers = new ObservableCollection<string>(); 

    var num = await ScanCodeVM.CodePage(); // returns a string 

    if (num != null) 
    { 
     ListNumbers.Add(num);  
    } 
} 

問題がリストの1つの数を保持しているということです。別のスキャンの後、 は前の番号を削除し、新しい番号を保存します。

私の質問はどのように以前の数字も保存することができますか?

+5

クリックごとに 'ListNumbers'の新しいインスタンスを作成しないでください。例えばアプリケーションの起動時にリストをインスタンス化します。 – Fabio

+0

それは犯人ですか?または 'var num'を配列として宣言すべきですか? – cholo

答えて

3

この機能の外にリストを作成し、別の機能でフォームを追加/削除する必要があります。コレクションにのみ固有の番号を持つのクリック方法

  • の外の数字の

    ListNumbers = new ObservableCollection<string>(); 
    public async void StoreNum() 
    { 
    
    var num = await ScanCodeVM.CodePage(); // returns a string 
    
    if (num != null) 
    { 
        ListNumbers.Add(num);  
    } 
    } 
    
    // do something with that list. 
    
  • +0

    既にリストに既に追加されている番号が含まれているかどうかを確認するにはどうすればよいですか?もしそうなら、それはそれを追加しません。 – cholo

    +1

    ListNumbers.Contains( "value")メソッドを呼び出して追加します。 – Valuator

    +1

    ありがとうございます:)それは動作します。 – cholo

    0
    1. インスタンス化コレクションはユニークな値を追加します HashSet<string>
    public class NumberReader 
    { 
        public HashSet<string> Numbers { get; set; } 
    
        // Numbers instantiated in constructor 
        public NumberReader() 
        { 
         Numbers = new HashSet<string>(); 
        } 
    
        // Executed when user click a button 
        public async Task Read() 
        { 
         var number = await ScanCodeVm.CodePage(); 
         if (number != null) 
         { 
          Numbers.Add(number); 
         } 
        } 
    } 
    

    HashSet<T>.Addメソッドを使用します。指定された値が正常に追加された場合はtrueを返し、指定された値がすでにセットに存在する場合はfalseを返します。

    可能なすべての例外が「飲み込まれる」ため、関数にはasync voidを使用しないでください。しかし、イベントハンドラにはasync voidを使用しても問題ありません。

    +0

    ありがとう、あなたの助けもありがとう:) '可能性のあるすべての例外が"飲み込まれる "ため、'関数にasync voidを使用しないでください。しかし、イベントハンドラのために非同期voidを使用することはOKです。 " さらに説明できますか? – cholo

    +0

    そこから:[https://blog.stephencleary.com/2012/02/async-and-await.html](https://blog.stephencleary.com/2012/02/async-and-await.html) 「戻り値の型」についての段落を確認してください。 – Fabio

    関連する問題