我有两个选择器。第二个选择器取决于第一个选择器。两个选择器都是从Service绑定的。我正在使用字典对象将数据绑定到选择器。 我没有使用MVVM模式。
System.ArgumentOutOfRangeException:索引超出范围。一定是 非负面且小于集合的大小。
参数名称:index
全球宣言:
Dictionary<string, string> DicObjActivityType;
Dictionary<string, string> DicObjSelfActivity;
第一个Picker selectedIndexChange事件
private async void PckrActivityType_SelectedIndexChanged(object sender, EventArgs e)
{
if (sender as Picker == null)
return;
else
{
var objActivityType = sender as Picker;
var Key = DicObjActivityType.FirstOrDefault(x => x.Value == objActivityType.Items[objActivityType.SelectedIndex]).Key;
PickedActivityType = Key;
if (Key != "0")
{
PckrSelfActivity.IsEnabled = true;
await CallGetWebService_SelfActivity(Key);
if (PckrSelfActivity.IsEnabled == true)
{
PckrSelfActivity.Items.Clear();
foreach (string items in DicObjSelfActivity.Values)
{
PckrSelfActivity.Items.Add(items);
}
}
}
else
{
PckrSelfActivity.IsEnabled = false;
}
}
}
拨打第二个选择器的服务
private async Task CallGetWebService_SelfActivity(string strkey)
{
try
{
var response = await GetResponseFromWebService.GetResponse<ServiceClasses.RootObject_LstListComboData>(ServiceURL.GetSelfActivity + "ActivityTypeCd=" + strkey);
if (response.Flag == true)
{
DicObjSelfActivity = new Dictionary<string, string>();
DicObjSelfActivity.Add("0", "--Select--");
if (response.lstListComboData != null)
{
foreach (ServiceClasses.LstListComboData Items in response.lstListComboData)
{
DicObjSelfActivity.Add(Items.Value, Items.Text);
}
}
}
else
{
PckrSelfActivity.IsEnabled = false;
}
}
catch (Exception e)
{
await DisplayAlert(AppResources.LError, AppResources.LConnectionError, "OK");
}
}
我参考以下链接来解决此问题
https://forums.xamarin.com/discussion/55922/picker-clear-system-argumentoutofrangeexception
但没有找到解决方案。
如果选择了任何值,我们无法清除选择器吗?
我不想使用BindablePicker cutom控件。
答案 0 :(得分:3)
我不确定“清除选择器”是否意味着重置它以使其不显示任何选定的项目。但如果这就是你想要的,那么你可以做到以下几点:
设置SelectedIndex = -1
。这会重置选择器,使得没有选择任何项目。
设置SelectedIndex = -1
后,会调用selectedIndexChange
事件处理程序,这会导致
System.ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。
确实是的,SelectedIndex
是-1
,所以它抱怨索引必须是非负数。
if
语句,其中包含SelectedIndexChange
事件处理程序,以便处理程序仅执行if (SelectedIndexChange != -1)
。总之,请执行以下操作:
YourPicker.SelectedIndex = -1;
YourPicker.SelectedIndexChanged += (sender, e) =>
{
if (YourPicker.SelectedIndex != -1)
{
//Do your stuff
}
}
答案 1 :(得分:0)
我认为您收到此错误是因为您清理了选择器中的所有项目。我有同样的错误,但我现在正在使用MVVM,它更简单,你可以更好地管理这类事情。
答案 2 :(得分:0)
实际上我做了以下工作,它对我来说很好:
//step 1: re-select index to -1
YourPicker.SelectedIndex = -1;
//step 2: clear all items
YourPicker.Items.Clear();
//refill the picker
foreach (var item in subAccountStatus)
{
YourPicker.Items.Add(item.AccountStatus);
}
//re-selected index to first item
YourPicker.SelectedIndex = 0;
答案 3 :(得分:0)
现在Picker
类使用绑定,您可以使用List
属性将ItemSource
个字符串绑定到选择器。我在应用程序中解决此问题的方法是创建了一个名为GeneratePickerSource()
这是我在XAML中的Picker
:
<Picker x:Name="myPicker" Title="Placeholder"/>
然后我的GeneratePickerSource()
方法:
List<string> pickerStrings = new List<string>();
//Add your picker options to the list
myPicker.ItemSource = pickerStrings;
通过使用此方法,无论何时拨打GeneratePickerSource()
,都会重置选择器并且没有选定项目(对于myPicker
,它会显示&#34;占位符&#34;因为那样是Title
)。
如果您的列表很短,此解决方案很有效,这很可能就是这种情况。但如果每次都需要生成非常大的列表,这可能会很慢。
在您的情况下,您可以使用Dictionary
执行与List
相同的操作,只需创建一个新的Dictionary
,填写它,然后将其设置为{ {1}}。