可编辑的ListView

时间:2009-04-30 19:14:49

标签: c# winforms user-interface listview

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

9 个答案:

答案 0 :(得分:16)

你问的是错误的问题:)

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

答案 1 :(得分:6)

ObjectListView将会完成这一切,甚至更多。它是普通.NET ListView的包装器。它是开源的。

其网站有Getting Started可帮助您入门,以及专门讨论cell editing的整页

答案 2 :(得分:1)

您可以使用listview的DoubleClick事件,当它被调用时,您将打开一个新表单,其中用户将为所选项目输入新值。然后,当用户按下确定时,您可以将特定项目的值编辑为用户输入的内容。

答案 3 :(得分:0)

从它的声音中,您可能需要考虑使用DataGridView。

DataGridView (MSDN)

答案 4 :(得分:0)

DataGridView是你的朋友 SourceGrid是另类

答案 5 :(得分:0)

您可以使用DataTemplate指定列包含文本框(如果可编辑)或文本块(如果不可编辑),然后将文本框绑定到绑定到listview的itemsource的源对象集合中的类属性。 / p>

<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 :(得分:0)

是的,使用DataGridView。

您不仅可以编辑单元格,而且如果您声明一个通用列表,其中T是您要在网格中显示的类,您可以设置DataSource =该列表,并在编辑gridview时实际编辑自动列出!

答案 7 :(得分:-1)

答案 8 :(得分:-1)

我最近遇到过这个问题。从Simon Gillbee那里得到提示,可以将DataGridView配置为与ListView非常相似,我搜索了一个明智的解决方案来实现这一点。以下代码对我来说效果很好。 Source here

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方法。

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

对于需要协助将自定义控件合并到其项目中的人here