可编辑的列表视图

23

我希望在一个C# Winforms应用程序中创建可编辑的ListView,在其中用户可以双击单元格以更改其内容。如果有人能够提供一些指导和/或示例,那将是非常好的。我不想使用任何商业产品。


你的问题可能在这里得到解答:C#:如何编辑ListView中的项和子项? - user189721
我不同意我们不应该考虑像DataGridView、ObjectListView或者甚至商业解决方案这个,价格足够便宜的ListView替代品。采用基于文本框编辑器的通用方法,可能会有很多缺点需要自行解决。例如,您需要提供良好的键盘接口来编辑子项,文本框应该能够与ListView一起滚动等。使用一个好的第三方解决方案可以节省大量编码时间,而且最终还可以赚更多。 - TecMan
9个回答

20

你问的问题不正确 :)

ListView不是正确的控件。使用DataGridView控件。它可以配置成看起来就像ListView,但支持单元格的原地编辑。


4
那是个观点问题。DataGridView并非总能适合使用场景或提供所需的外观和感觉。但是,根据发帖人的目标,这仍然是一个可能的选择。 - Jeff Yates
8
你不能使用DataGridView进行分组视图。此外,只有ListView支持的其他一些功能。 - code4life
花了我一分钟,但是,“ListVIEW”...视图-不是-编辑。有趣的是,DataGridVIEW则可以编辑。嗯。 - Gary Huckabone

6
一个ObjectListView可以做到这一点,而且还有更多功能。它是一个普通的.NET ListView的包装器,是开源的。
它的网站有一个Getting Started来帮助您开始,以及一个专门用于cell editing的页面。

1
谢谢您的回复。这个自定义控件看起来很有趣,但可能对于我尝试做的事情来说有些过头了。不过我仍然会进行尝试。 - THE DOCTOR
3
实际上,这并不是一个自定义控件。它只是一个围绕着普通的ListView的有用包装器。但是我们不会告诉任何人 :) - Grammarian
1
它可能并不适用于所有项目的许可证(因为它似乎是在GPLv3下) - Rowland Shaw
使用这个库进行编辑不是很好。当我按Tab键时,打开下一个控件非常慢。我找不到解决方法。 - bh_earth0

1
您可以使用 ListView 的 DoubleClick 事件,在调用时打开一个新表单,在那里用户可以为所选项输入新值。然后当用户按下确定后,您将编辑特定项的值为用户输入的内容。

1

0
你可以使用DataTemplate来指定该列包含一个文本框(如果可编辑)或一个文本块(如果不可编辑),然后将文本框绑定到你的源对象集合中绑定到你的列表视图项源的类属性。
<Window.Resources>
    <ResourceDictionary>
        <DataTemplate x:Key="NameHeader">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Name" VerticalAlignment="Center" Margin="10,0,0,0" />
            </StackPanel>
        </DataTemplate>
        <DataTemplate x:Key="NameCell">
            <StackPanel Orientation="Horizontal">
                <TextBox Text="{Binding Path=Name}" VerticalAlignment="Center" Margin="10,0,0,0" />
            </StackPanel>
        </DataTemplate>
    </ResourceDictionary>
</Window.Resources>

<Grid>
    <ListView x:Name="lvwList" Height="200" VerticalAlignment="Top" ItemsSource="{Binding Path=SourceObjectCollection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" HeaderTemplate="{StaticResource NameHeader}" CellTemplate="{StaticResource NameCell}" Width="140" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

Nick Hanshaw


6
欢迎来到 SO,Nick。这是一个不错的回答,但不幸的是问题被标记为“winforms”,而不是“wpf”。 - Christoffer Lette

0

是的,使用一个DataGridView。

不仅可以编辑单元格,而且如果你声明一个泛型列表,其中T是你想在网格中显示的类,你可以将DataSource设置为该列表,当你编辑GridView时,实际上是自动地编辑了列表!


0

DataGridView是你的好朋友,SourceGrid是另一种选择。


-1

我最近遇到了这个问题。在得到Simon Gillbee的提示后,我意识到可以将DataGridView配置成类似ListView的样式,于是我开始寻找一个合理的解决方案来实现这一目标。以下代码对我非常有效。源代码在这里

class GridLineDataGridView : DataGridView
{
    public GridLineDataGridView()
    {
        this.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        int rowHeight = this.RowTemplate.Height;

        int h = this.ColumnHeadersHeight + rowHeight * this.RowCount;
        int imgWidth = this.Width - 2;
        Rectangle rFrame = new Rectangle(0, 0, imgWidth, rowHeight);
        Rectangle rFill = new Rectangle(1, 1, imgWidth - 2, rowHeight);
        Rectangle rowHeader = new Rectangle(2, 2, this.RowHeadersWidth - 3, rowHeight);

        Pen pen = new Pen(this.GridColor, 1);

        Bitmap rowImg = new Bitmap(imgWidth, rowHeight);
        Graphics g = Graphics.FromImage(rowImg);
        g.DrawRectangle(pen, rFrame);
        g.FillRectangle(new SolidBrush(this.DefaultCellStyle.BackColor), rFill);
        g.FillRectangle(new SolidBrush
           (this.RowHeadersDefaultCellStyle.BackColor), rowHeader);

        int w = this.RowHeadersWidth - 1;
        for (int j = 0; j < this.ColumnCount; j++)
        {
            g.DrawLine(pen, new Point(w, 0), new Point(w, rowHeight));
            w += this.Columns[j].Width;
        }

        int loop = (this.Height - h) / rowHeight;
        for (int j = 0; j < loop + 1; j++)
        {
            e.Graphics.DrawImage(rowImg, 1, h + j * rowHeight);
        }
    }
}

只需从 DataGridView 继承并重写 OnPaint 方法。

您可以更改控件的各种属性以适应您的需求和偏好。

对于那些需要帮助将自定义控件纳入其项目的人,请查看 此处


示例并不完整。对于那些初次接触WPF的人来说,应该把新的DataGrid放在哪里? - C.J.
@CJohnson:这个问题是关于WinForms而不是WPF的,请检查问题标签和上下文。 - Derek W

-1

7
这是一篇关于WPF的文章。这是所需的内容,还是我们在看纯WinForms?标签显示为WinForms。 - Simon Gillbee

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