【问题标题】:Argument Exception:Value does not fall in the expected range参数异常:值不在预期范围内
【发布时间】:2013-11-13 05:23:57
【问题描述】:

当我从 ObservableCollection 中删除项目时,在删除一定数量的项目后,我收到一个参数异常,提示“值不在预期范围内”。

代码如下:

public abstract class BaseList<T> : ObservableCollection<T>
{

}

public class Videos
{
   //Contains members and methods
}

public class VideoList:BaseList<Videos>
{
   //Contains members and methods
}


//Singleton class
public class VideoPlaylist
{
    private static VideoPlaylist _instance;
    public static VideoPlaylist Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new VideoPlaylist();
            }
            return _instance;
        }
    }

    private VideoList _myPlaylist = new VideoList();
    public VideoList MyPlaylist
    {
        get { return _myPlaylist; }
        set
        {
            if (_myPlaylist != value)
            {
                _myPlaylist = value;
            }
        }
    }
   public void RemoveFromPlayList(string id)
   {
        if (MyPlaylist != null)
        {
            for (int index = MyPlaylist.Count - 1; index >= 0; index--)
            {
                Videos video = MyPlaylist.ElementAt(index);
                if (video.Id == id)
                {
                    MyPlaylist.RemoveAt(index);
                }
            }
        }
    }

}

xaml:

<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Name="VideoItemListTemplate">
        <Grid MinHeight="100"
              Margin="0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>

            <!--Content-->
            <Grid Grid.Row="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <!--Image-->
                <Grid Grid.Column="0">
                    <Image Stretch="UniformToFill"
                           Grid.Column="0"
                           Height="150"
                           Width="150">
                        <Image.Source>
                            <BitmapImage UriSource="{Binding Image}"
                                         CreateOptions="BackgroundCreation" />
                        </Image.Source>
                    </Image>


                </Grid>

                <!--Description and Publish Date-->
                <StackPanel 
                            Grid.Column="1">

                    <TextBlock Text="{Binding Title}"
                               TextAlignment="Left"
                               TextWrapping="Wrap"
                               MaxHeight="100"
                               Margin="12,0,0,0"
                               FontSize="30"
                               Style="{StaticResource RangeelaTextBlockStyle}"                                   
                               TextTrimming="WordEllipsis"
                               VerticalAlignment="Top" />

                    <Button Content="Remove" Foreground="#bd8326" 
                            BorderBrush="#bd8326" Click="Remove_Clicked" 
                            FontWeight="Thin" FontSize="25"
                            BorderThickness="0.8"/>

                </StackPanel>
            </Grid>

            <!--Line Seperator-->
            <!--<Rectangle Grid.Row="1" Height="1"
                       Stroke="White"
                       StrokeThickness="0.6" Opacity="0.4"
                       Margin="0,12" />-->

        </Grid>
    </DataTemplate>
</phone:PhoneApplicationPage.Resources>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   Foreground="White"
                   x:Name="EmptyPlaylistMessage"
                   Text="Playlist is empty" 
                   Visibility="Collapsed"/>

        <ProgressBar x:Name="MyProgressBar"
                     Visibility="Collapsed"
                     IsIndeterminate="False" />

        <phone:LongListSelector x:Name="LatestVideoPivotItem"
                                LayoutMode="List"
                                GridCellSize="210,250"
                                Margin="12,12,12,0"
                                Tap="Videos_Tapped"
                                ItemTemplate="{StaticResource  VideoItemListTemplate}"
                                ItemsSource="{Binding}"/>
    </Grid>

MainPage 上的 RemoveClicked 方法:

private void Remove_Clicked(object sender, RoutedEventArgs e)
    {
        Button image = sender as Button;
        Videos video = image.DataContext as Videos;
        _IsAddToPlaylistSelected = true;
        if (video != null)
        {
                VideoPlaylist.Instance.RemoveFromPlayList(video.Id);               
        }        
    }

在主页中,我使用 Singleton 类的实例并尝试删除项目。

【问题讨论】:

  • 发布堆栈跟踪有这么难吗?
  • 堆栈跟踪显示为“外部代码”。
  • 这里是 xaml 代码
  • 我的意思是堆栈跟踪,当您在调试器中查找异常详细信息时,而不是“堆栈跟踪”窗口。
  • 请添加异常的堆栈跟踪

标签: c# windows windows-phone-7 windows-phone-8 observablecollection


【解决方案1】:

我用 ListBox 替换了 LongListSelector。成功了。。

【讨论】:

    【解决方案2】:

    如果您想从 Collection 中删除某些元素,请确保您不是 iterating,这在此处发生。

            for (int index = MyPlaylist.Count - 1; index >= 0; index--)
            {
                Videos video = MyPlaylist.ElementAt(index);
                if (video.Id == id)
                {
                    MyPlaylist.RemoveAt(index);
                }
            }
    

    MyPlaylist.Count 将随着您删除的每个元素而不断变化,因此它可能会抛出 Value does not fall in the expected range 异常。

    还是这样吧

            int totalitems = MyPlaylist.Count;
            List<Videos> l = new List<Videos>();
    
            for (int index = totalitems - 1; index >= 0; index--)
            {
                Videos video = MyPlaylist.ElementAt(index);
                if (video.Id == id)
                {
                    l.Add(video);
                }
            }
    

    现在删除项目

                foreach(Videos v in l)
                {
                   if(MyPlaylist.Contains(v))
                   {
                       MyPlaylist.Remove(v);
                   }
                }
    
                l.Clear();
    

    【讨论】:

    • 感谢您的回复。我试过你的解决方案。它仍然显示相同的异常
    • 在您的函数上放置一个try catch 块,并在catch 上设置一个断点。当代码进入您的 catch 块时,检查变量 indexMyPlayList.Count 的值。检查index 是否超过MyPlayList.Count 或小于0。然后相应地处理您的代码。
    • 我已经尝试了所有这些。它是 longlistselector 中的一个错误。当 LongListSelector 被 ListBox 替换时,代码可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多