在listview wpf中获取所选项目

时间:2015-07-14 05:29:55

标签: wpf

我创建了listview我需要在textBox点击编辑按钮时显示所选项目,我的代码显示以下错误。

  

PresentationFramework.dll中出现未处理的“System.ArgumentOutOfRangeException”类型异常

     

附加信息:指定的参数超出了有效值的范围。

  <ListView x:Name="lstvUnit" HorizontalAlignment="Left" Height="149" Margin="10,192,0,0" VerticalAlignment="Top" Width="321">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="50"  DisplayMemberBinding="{Binding Path=Id}" />
                <GridViewColumn Header="Unit" Width="150" DisplayMemberBinding="{Binding Path=name}"/>
                <GridViewColumn Header="Edit" Width="60">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Button x:Name="btnEdit" Content="Edit" Width="50" CommandParameter="{Binding}" HorizontalContentAlignment="Right" Style="{StaticResource NewImg}" Cursor="Pen" Foreground="Blue" Click="btnEdit_Click"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

cs代码如下所示

DataRowView item = lstvUnit.Items.GetItemAt(lstvUnit.SelectedIndex) as DataRowView;
txtUnit_Name.Text = item[0].ToString();

5 个答案:

答案 0 :(得分:1)

这只是说项目没有0的索引。你确定你不只需要item.ToString()吗? GetItemAt()听起来应该只返回一个项目,而不是它们的集合。如果您尝试访问item变量的子项,请尝试item.subitems [0]

答案 1 :(得分:1)

您是否检查了lstvUnit.SelectedIndex>=0中是否GetItemAt,所以如果选择了任何项目。

答案 2 :(得分:1)

你的异常是

  由于您的selectedIndex为-1,因此在PresentationFramework.dll'异常中出现'System.ArgumentOutOfRangeException'。

将selectedIndex设置为Listviewxaml中的某个值为“1”,然后不会抛出异常。

此外,点击事件将针对按钮触发。不要以为当您点击“修改”按钮时,您选择了特定的ListviewItem。该事件首先在子项目中注册,如果您希望通过父项触发,则需要在事件触发器上设置e.Handled=false

还有一个问题是您正在将项目转换为DataRowView,这是错误的。您需要将其强制转换为Collection类类型,然后使用该项。它只返回一个项目 item[0]错了。

答案 3 :(得分:1)

一些事情。

由于您使用的是DataRowView,因此无法使用索引值,因为它未返回集合。此外,您不能简单地将整行转换为字符串,因为该行包含列等。

您可以格式化自己的字符串,并使用对象的属性名称访问行的每列中的值。此外,您还应该进行错误检查。

if (lstvUnit.SelectedIndex >= 0)
{
    var item = lstvUnit.Items.GetItemAt(lstvUnit.SelectedIndex) as DataRowView;
    if (item != null)
    {
        xtUnit_Name.Text = string.Format("{0} {1}", item["Id"], item["name"];
    }
}

答案 4 :(得分:-1)

我得到了上面的问题解决方案。

       if (lstvUnit.SelectedIndex >= 0)
       {   
         DataRowView item = lstvUnit.Items.GetItemAt(lstvUnit.SelectedIndex) as DataRowView;
            txtUnit_Id.Text = item[0].ToString();
            txtUnit_Name.Text = item[1].ToString();
        }