如何在DataGridView单元格中选择一行?

3
亲爱的用户们:我有一个 datagridview,在使用 C# 的 Windows 表单中,此 datagridview 具有如下列:
- 名称 - 价格 - 细节
我有按钮将为每个单元格设置值,一行只包含一个名称和价格,但可以包含多个细节行,为此我使用 environmental.newline 分隔了每个条目,以便于对详情进行记录。 enter image description here 好的,我希望您能理解这个想法,现在真正有趣的部分是,我希望用户能够点击并选择位于该项目 datagridview 行内的其中一个子行。另外,这个 datagridview 并没有绑定到任何表。这可行吗?谢谢大家。

欢迎来到Stackoverflow。我已经编辑了你的问题。如果你正在使用winforms,请在你的问题中打上[winforms]标签。并且请包含你遇到问题的代码示例。 - Federico Berasategui
好的,谢谢,下次我会小心的。 :) - user2793090
2个回答

2

因为楼主要求,我来回答这个问题。

以下是在WPF中实现的方法:

<Window x:Class="MiscSamples.ListBoxInCell"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ListBoxInCell" Height="300" Width="300">
    <DockPanel>
        <Button Content="Show Selected Detail" DockPanel.Dock="Bottom"
                Click="ShowDetail"/>

        <ListView ItemsSource="{Binding Items}"
              SelectedItem="{Binding SelectedItem}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Producto" DisplayMemberBinding="{Binding Product}"/>
                    <GridViewColumn Header="Detalle">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <ListBox ItemsSource="{Binding Details}"
                                     SelectedItem="{Binding SelectedDetail}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </DockPanel>
</Window>

代码后台:

public partial class ListBoxInCell : Window
{
    public ViewModel ViewModel { get; set; }

    public ListBoxInCell()
    {
        InitializeComponent();

        DataContext = ViewModel = new ViewModel();
    }

    private void ShowDetail(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(ViewModel.SelectedItem.SelectedDetail);
    }
}

视图模型:

public class ViewModel
{
    public List<Data> Items { get; set; }

    public Data SelectedItem { get; set; }

    public ViewModel()
    {
        //Sample Data
        Items = Enumerable.Range(0, 100).Select(x => new Data
            {
                Product = "Product" + x.ToString(),
                Details = Enumerable.Range(0, 3)
                                    .Select(d => "Detail" + x.ToString() + "-" + d.ToString())
                                    .ToList()
            }).ToList();
        SelectedItem = Items.First();
    }
}

数据项:

public class Data
{
    public string Product { get; set; }

    public List<string> Details { get; set; } 

    public string SelectedDetail { get; set; }
}

结果:

在此输入图片描述

  • MVVM,即数据与UI分离,UI与数据分离。
  • 没有“owner draw”,没有“P/Invoke”(不管那是什么),也没有可怕的过程性黑客。只有美丽的XAML和DataBinding。
  • 每行内部每个ListBox的选择是独立的,您可以通过一个简单的LINQ查询和迭代将所有其他项设置为null来仅保留1个选定的项。
  • 单击按钮以查看ListView中当前选定行的当前选定详细信息。
  • WPF很棒,在文件 -> 新建项目 -> WPF应用程序中复制并粘贴我的代码,亲自查看结果。
  • 忘记winforms。它毫无用处。它不支持任何级别的自定义,并需要许多可怕的黑客来完成所有事情。它不支持(真正的)DataBinding,并将您强制进入乏味的过程性方法。

0

DataGridView不支持在一行中使用子行。因此,我的建议是您应该使用两个DataGridView:

  • 一个包含名称和价格列表。
  • 另一个显示属于第一个DataGridView中当前选定行的详细行列表。

我非常希望在WPF中看到这个,如果您可以向我展示一些代码,我会很感激的=D - user2793090

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接