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

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

19 голосов
/ 30 апреля 2009

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

Ответы [ 9 ]

17 голосов
/ 30 апреля 2009

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

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

6 голосов
/ 13 мая 2009

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

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

1 голос
/ 21 июля 2011

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

0 голосов
/ 25 апреля 2017

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

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

0 голосов
/ 20 марта 2013

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

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

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

0 голосов
/ 06 июня 2012

Вы можете использовать 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>

Ник Хэншоу

0 голосов
/ 27 мая 2009

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

0 голосов
/ 01 мая 2009

Может быть, это может помочь вам:

msdn: как создать ListView с редактируемыми ячейками

0 голосов
/ 30 апреля 2009

Судя по звукам, вы можете рассмотреть возможность использования вместо DataGridView.

DataGridView (MSDN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...