Ответ 1
Вы задаете неправильный вопрос:)
ListView не является правильным элементом управления. Используйте элемент управления DataGridView. Его можно настроить так, чтобы он выглядел как ListView, но он поддерживает редактирование ячеек на месте.
Я ищу создать редактируемый ListView в приложении winforms С#, где пользователь может дважды щелкнуть по ячейке, чтобы изменить его содержимое. Было бы здорово, если бы кто-то мог предоставить мне некоторые рекомендации и/или пример. Я не хочу использовать какие-либо коммерческие продукты.
Вы задаете неправильный вопрос:)
ListView не является правильным элементом управления. Используйте элемент управления DataGridView. Его можно настроить так, чтобы он выглядел как ListView, но он поддерживает редактирование ячеек на месте.
ObjectListView будет делать именно это и многое другое. Это оболочка вокруг обычного .NET ListView. Это с открытым исходным кодом.
На своем веб-сайте есть Начало работы, чтобы помочь вам начать, а также целую страницу, посвященную редактирование ячеек
Вы можете использовать событие DoubleClick listview, и когда он вызывается, вы откроете новую форму, в которой пользователь будет вводить новое значение для выбранного элемента. Затем, когда пользователь нажал кнопку ОК, вы должны отредактировать значение определенного элемента для введенного пользователем.
Из звуков этого может потребоваться вместо этого использовать DataGridView.
DataGridView - ваш друг SourceGrid является альтернативным
Да, используйте DataGridView.
Вы не можете редактировать ячейку, но если вы объявите общий список, где T - это класс, который вы хотите отобразить в сетке, вы можете установить список DataSource =, и при редактировании gridview вы фактически редактируете Список автоматически!
Возможно, это может вам помочь:
Вы можете использовать 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>
Ник Ханшоу
Недавно я столкнулся с этой проблемой. После получения подсказки от Саймона Гиллби, что можно настроить 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
.
Вы можете изменить различные свойства элемента управления в соответствии с вашими потребностями и предпочтениями.
Для тех, кто нуждается в помощи с включением пользовательского элемента управления в свой проект, посмотрите здесь.