Подтвердить что ты не робот

Редактируемый ListView

Я ищу создать редактируемый ListView в приложении winforms С#, где пользователь может дважды щелкнуть по ячейке, чтобы изменить его содержимое. Было бы здорово, если бы кто-то мог предоставить мне некоторые рекомендации и/или пример. Я не хочу использовать какие-либо коммерческие продукты.

4b9b3361

Ответ 1

Вы задаете неправильный вопрос:)

ListView не является правильным элементом управления. Используйте элемент управления DataGridView. Его можно настроить так, чтобы он выглядел как ListView, но он поддерживает редактирование ячеек на месте.

Ответ 2

ObjectListView будет делать именно это и многое другое. Это оболочка вокруг обычного .NET ListView. Это с открытым исходным кодом.

На своем веб-сайте есть Начало работы, чтобы помочь вам начать, а также целую страницу, посвященную редактирование ячеек

Ответ 3

Вы можете использовать событие DoubleClick listview, и когда он вызывается, вы откроете новую форму, в которой пользователь будет вводить новое значение для выбранного элемента. Затем, когда пользователь нажал кнопку ОК, вы должны отредактировать значение определенного элемента для введенного пользователем.

Ответ 4

Из звуков этого может потребоваться вместо этого использовать DataGridView.

DataGridView (MSDN)

Ответ 5

DataGridView - ваш друг SourceGrid является альтернативным

Ответ 6

Да, используйте DataGridView.

Вы не можете редактировать ячейку, но если вы объявите общий список, где T - это класс, который вы хотите отобразить в сетке, вы можете установить список DataSource =, и при редактировании gridview вы фактически редактируете Список автоматически!

Ответ 8

Вы можете использовать DataTemplate, чтобы указать, что столбец содержит текстовое поле (если редактируется) или текстовый блок (если не редактируемый), затем привяжите текстовое поле к свойству класса из вашей коллекции исходных объектов, привязанному к источнику данных listview.

<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>

Ник Ханшоу

Ответ 9

Недавно я столкнулся с этой проблемой. После получения подсказки от Саймона Гиллби, что можно настроить 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.

Вы можете изменить различные свойства элемента управления в соответствии с вашими потребностями и предпочтениями.

Для тех, кто нуждается в помощи с включением пользовательского элемента управления в свой проект, посмотрите здесь.