【问题标题】:How to select a row inside a datagridview cell?如何在datagridview单元格中选择一行?
【发布时间】:2013-09-20 22:01:38
【问题描述】:

尊敬的用户:我有一个 datagridview,我在一个带有 c sharp 的 windows 窗体中使用,这个 datagridview 的列如下:

  • 姓名
  • 价格
  • 详情

我有按钮可以为每个单元格设置值,一行只能包含一个名称和价格,但有几个详细信息行,为了达到目的,我用 environment.newline 分隔每个条目,以防条目用于详情。

好的,所以我希望你明白这一点,现在真正有趣的部分是我希望用户能够单击并选择该项目的 datagriview 行内的子行之一。此数据网格也未绑定到任何表。这可以做到吗?谢谢大家了

【问题讨论】:

  • 欢迎来到 Stackoverflow。我已经编辑了你的问题。如果您使用的是 winforms,请标记您的问题[winforms]。并包含您遇到的任何问题的代码示例。
  • Ok thx,下次要小心了:)

标签: c# winforms datagridview


【解决方案1】:

发布此答案是因为 OP 要求它。

这就是你在 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 与数据分离。
  • 没有“所有者抽奖”,没有“P/Invoke”(无论是什么意思),也没有可怕的程序性黑客行为。只有漂亮的 XAML 和 DataBinding。
  • 每行内每个 ListBox 的选择是单独的,您可能希望通过简单的 LINQ 查询和迭代将所有其他项目设置为 null 来仅保留 1 个选定项目。
  • 单击按钮可查看 ListView 中当前选定行的当前选定详细信息。
  • WPF Rocks,将我的代码复制并粘贴到 File -&gt; New Project -&gt; WPF Application 中,然后亲自查看结果。
  • 忘记winforms。没用的。它不支持任何级别的自定义,并且需要对所有内容进行大量可怕的黑客攻击。它不支持(真正的)DataBinding,并迫使您采用无聊的程序方法。

【讨论】:

    【解决方案2】:

    DataGridView 不支持一行中的子行。所以,我的建议是你应该使用两个 DataGridView:

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

    【讨论】:

    • 我很想在 wpf 中使用它,如果你能告诉我一些代码 id,请欣赏它 =D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多