【问题标题】:Silverlight: Value does not fall within the expected range exceptionSilverlight:值不在预期范围内异常
【发布时间】:2011-05-20 03:16:32
【问题描述】:

添加时出现“值不在预期范围内的异常” 孩子们堆叠面板。即使在添加到 stackpanel 之前 myStackPanel.Children.Count = 0 也会发生这种情况。知道为什么吗?

void func()
{
          myStackPanel.Children.Clear();        
          List<Docs> lDocs =  docDictionary[ID];
          foreach (Docs lDoc in lDocs)
          {
                 ...
                 Border myTextborder = new Border();                   
                 myTextborder.BorderThickness = new Thickness(1);
                 myTextborder.Name = lDoc.Name;
                 ...

                 myStackPanel.Children.Add(myTextborder);   //Getting Value does not fall within the expected range exception here
          }
}

func() 被多次调用。我读到当我们尝试添加具有相同名称的孩子时会发生错误。但在我的情况下,我正在清除堆栈面板,即使每次调用 func() 时 foreach 循环只运行一次,也会发生错误

【问题讨论】:

  • 如果你把myTextborder.Name这一行注释掉怎么办?
  • 另外,您在示例中用“...”替换的代码可能是相关的。
  • 如果我评论它就不会发生错误。但是对于每个 func 调用,我都在清除堆栈面板。为什么会发生这种情况。上一次 func() 调用中的 myTextBorder.Name 可能重复,而不是当前调用。当我每次清除时,这有什么关系。
  • @Josh 在 ... 部分对 myStackPanel 或 myText 边框的唯一更改是 myTextborder.Child = myControl;
  • 如果在注释掉设置名称的行时没有发生错误,那么您可能设置了无效的名称。正如我在下面的回答中所述,您必须确保设置了有效的标识符名称。因此,例如“myBorder”会起作用,但“My Border”不会。

标签: c# silverlight


【解决方案1】:

当添加了两个同名的元素时,可能会导致此错误。在您的情况下,是否有任何重复的 lDoc.Name 值?如果是这样,您可以添加一个额外的唯一标识符。例如:

int id = 0; //outside foreach loop

myTextborder.Name = lDoc.Name + id.ToString();
id++;

【讨论】:

    【解决方案2】:

    仔细检查堆栈跟踪。有时行号关闭,但有可能在 Name 属性的设置器中发生异常。它必须遵循标识符的常规规则。

    【讨论】:

      【解决方案3】:

      在我看来,你真正想要的是ItemsControl,你并没有真正使用 Silverlight 的功能:-

      <ScrollViewer>
           <ItemsControl x:Name="items">
               <ItemsControl.ItemTemplate>
                   <DataTemplate>
                      <Border BorderThickness="1">
                         <TextBlock Text="{Binding Name}" />
                         <!-- what ever xaml you require to represent a document -->
                      </Border>
                   </DataTemplate>
               </ItemsControl.ItemTemplate>
           </ItemsControl>
      </ScrollViewer>
      

      那么你的func 变成:-

      public void func()
      {
          items.ItemsSource =  docDictionary[ID];
      }
      

      【讨论】:

        【解决方案4】:

        我发现当您将控件的 Name 属性设置为与 Children 中的现有控件相同的名称时,通常会发生此错误。我的猜测是文档集合中有重复的名称。它并不总是出错,但有时会在没有解释的情况下出错。

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多