【问题标题】:Get data from selected row in Gridview in C#, WPF从 C#,WPF 中的 Gridview 中的选定行获取数据
【发布时间】:2009-10-19 06:32:16
【问题描述】:

我正在尝试从我在 XAML 中创建的 Gridview 中检索数据。

<ListView Name="chartListView" selectionChanged="chartListView_SelectionChanged">
  <ListView.View>
     <GridView>
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="250"/>
        <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}" Width="60"/>
        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="100"/>
     </GridView>
  </ListView.View>
</ListView>

我见过这样的代码:-

GridViewRow row = GridView1.SelectedRow;
TextBox2.Text = row.Cells[2].Text;

但是我的问题是我的 GridView 是在 XAML 中创建的,并且没有命名,即我无法(或不知道如何)创建对“gridview1”的引用,因此无法访问其中的对象。

我可以从 c# 或 XAML 命名或创建对我的 gridview 的引用,以便我可以使用上面的代码吗?

其次,我可以通过名称而不是索引访问数组元素吗,例如:-

TextBox2.Text = row.Cells["ID"].Text

感谢您的帮助。

【问题讨论】:

    标签: c# xaml gridview


    【解决方案1】:

    你做错了可怕的事情。您不应该尝试从网格单元中读取数据,而应该直接从您的业务对象中读取数据。当存在纯 XAML 解决方案时,您应该避免使用过程代码:

    <TextBox x:Name="TextBox2" Text={Binding SelectedItem.ID, ElementName=chartListView}"/>
    

    WPF 并不打算像您想要的那样使用。所以读取单个网格单元是一个肮脏的黑客。也就是说,它是这样的:

    string UglyHack(string name)
    {
        var columns = (chartListView.View as GridView).Columns;
        int index = -1;
        for (int i = 0; i < columns.Count; ++i)
        {
            if ((columns[i].Header as TextBlock).Text == name)
            {
                index = i;
                break;
            }
        }
        DependencyObject j = SelectedListView.ItemContainerGenerator.ContainerFromIndex(SelectedListView.SelectedIndex);
        while (!(j is GridViewRowPresenter)) j = VisualTreeHelper.GetChild(j, 0);
        return (VisualTreeHelper.GetChild(j, index) as TextBlock).Text;
    }
    

    【讨论】:

      【解决方案2】:

      是的,您可以命名您的网格视图:

      <GridView x:Name="chartGridView">
          ...
      </GridView>
      

      确保以下内容包含在 Window 定义中:

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      

      这将使您能够从您的 c# 代码中引用它。

      【讨论】:

      • 对不起,这是我尝试的第一件事。 VS 说:在 GridView 类型中找不到属性“名称”
      • 这使它在后面的代码中可见。有没有办法让它从视图模型中可见?
      • @Jeff - 你不应该像那样混合你的视图和视图模型。
      猜你喜欢
      • 2012-10-02
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2020-07-09
      相关资源
      最近更新 更多