2017-10-12 79 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);  
    } 
} 

的问题是,该名单是抱着一个号码。经过另一次扫描, 它删除以前的号码并存储新的号码。

我的问题是如何使它存储以前的数字?

+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

    谢谢你的帮助:) '不要使用异步无效函数 - 因为所有可能的异常将被“吞下”。但是,对于事件处理程序使用异步无效是可以的。“ 您可以进一步解释吗? – cholo

    +0

    从那里:[https://blog.stephencleary.com/2012/02/async-and-await.html](https://blog.stephencleary.com/2012/02/async-and-await.html) ,检查关于“退货类型”的段落 – Fabio

    相关问题