可编辑listView controls

http://www.cnblogs.com/604608/archive/2009/08/20/1550531.html

http://www.cnblogs.com/duzouzhe/archive/2010/04/01/1702411.html


这是2个不错的法子,我实现了一个版本:


private:
	HWND m_hEdit;

	BOOL m_bIsEdited;			//是否编辑过
 	int m_nItem, m_nSubItem;				// 记录上一次的项、子项




	afx_msg void OnDbClickList(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult);



void CMultipleColumnsDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{

	//LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;

	if( (m_nItem<0) || (m_nSubItem<0) || !m_bIsEdited)
		return ;

	TCHAR buf[MAX_PATH]={0};

	ASSERT(m_hEdit);

	::GetWindowText(m_hEdit,buf,MAX_PATH);

	::ShowWindow(m_hEdit,SW_HIDE);

	m_List.SetItemText(m_nItem,m_nSubItem,buf);

	m_bIsEdited=FALSE;


	
	//*pResult = 0;
}


void CMultipleColumnsDlg::OnDbClickList(NMHDR* pNMHDR, LRESULT* pResult) 
{

	LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;

	if( (temp->iItem< 0 )|| (temp->iSubItem<0) )
		return ;

	//记录
	m_nItem=temp->iItem;
	m_nSubItem=temp->iSubItem;

	CString str = GetItemText(temp->hdr.hwndFrom,temp->iItem ,temp->iSubItem);

	RECT rect;			//子矩形大小

	ListView_GetSubItemRect(temp->hdr.hwndFrom,temp->iItem,temp->iSubItem,LVIR_BOUNDS,&rect);

	ASSERT(m_hEdit);

	::MoveWindow(m_hEdit,rect.left+1,rect.top+1,rect.right-rect.left-2,rect.bottom-rect.top-2,TRUE);

	::ShowWindow(m_hEdit,SW_SHOW);

	::SetFocus(m_hEdit);

	::SetWindowText(m_hEdit,str);

	m_bIsEdited=TRUE;

	//*pResult = 0;
}


void CMultipleColumnsDlg::OnNMKillfocusList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码

	if( (m_nItem<0) || (m_nSubItem<0) ||!m_bIsEdited )
		return ;

	TCHAR buf[MAX_PATH]={0};

	ASSERT(m_hEdit);

	::GetWindowText(m_hEdit,buf,MAX_PATH);

	::ShowWindow(m_hEdit,SW_HIDE);

	m_List.SetItemText(m_nItem,m_nSubItem,buf);

	m_List.Invalidate();

	::UpdateWindow(m_List.GetSafeHwnd());	

	m_bIsEdited=FALSE;


	//*pResult = 0;
}


<think>好的,用户想知道如何在C#中设置ListView控件为可编辑状态。首先,我需要回忆一下之前学过的关于ListView控件的知识。记得ListView默认是不可编辑的,但可以通过一些方法来实现可编辑功能。 然后,查看用户提供的引用资料,特别是引用[3]提到要添加ListView控件到窗体,并设置属性如View为Details,FullRowSelect和GridLines。这可能为后续的编辑功能打下基础。引用[2]和[5]提到了修改数据和设置HeaderStyle,这可能涉及到事件处理和控件属性的调整。 接下来,考虑如何让用户能够编辑ListView中的项。通常的做法是在用户点击单元格时,显示一个文本框覆盖在该位置,允许输入。这需要处理ListView的MouseClick或DoubleClick事件,获取点击的位置,然后动态创建并定位TextBox控件。 另外,引用[4]提到了动态创建和调整列宽的问题,但用户的问题主要是关于可编辑,所以可能需要结合列的位置和宽度来正确放置文本框。引用[1]和[5]中的资源可能提供了具体的实现方法,比如设置列头不可点击,避免排序干扰编辑。 然后,整理步骤:首先配置ListView的基本属性,确保它是Details视图,并正确显示列和行。接着,处理双击或单击事件,确定点击的是哪个子项,获取其位置和大小,创建TextBox,让用户输入,输入完成后将值更新回ListView。 需要注意的细节包括事件处理的正确绑定,文本框的位置和大小调整,以及在用户完成编辑后的数据保存。可能还需要处理键盘事件,比如按下Enter确认编辑,Esc取消等。 最后,根据引用中的示例代码,编写一个简单的示例,展示如何实现这些步骤,并提醒用户相关的属性设置和可能遇到的问题,比如动态列宽的处理或者多行编辑的情况。</think>以下是C#中设置ListView控件为可编辑状态的完整实现方法,基于WPF和WinForms两种框架分别说明: ### 一、WPF实现方案 1. **基础配置** 设置`View`为`GridView`并启用编辑模板: ```xml <ListView Name="listView1" View="GridView"> <GridView.Columns> <GridViewColumn Header="ID" Width="120" DisplayMemberBinding="{Binding ID}"/> <GridViewColumn Header="姓名" Width="200"> <GridViewColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" MouseDown="TextBlock_MouseDown"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView> ``` 2. **编辑事件处理** 使用`TextBox`覆盖单元格实现编辑: ```csharp private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e) { var txtBlock = sender as TextBlock; var txtBox = new TextBox { Text = txtBlock.Text }; txtBox.LostFocus += (s, args) => { txtBlock.Text = txtBox.Text; grid.Children.Remove(txtBox); }; Grid grid = txtBlock.Parent as Grid; grid.Children.Add(txtBox); } ``` ### 二、WinForms实现方案[^2][^3] 1. **属性配置** 设置关键属性: ```csharp listView1.View = View.Details; listView1.FullRowSelect = true; listView1.LabelEdit = true; // 启用标签编辑 ``` 2. **动态编辑子项** 通过`TextBox`实现子项编辑: ```csharp private void listView1_MouseDoubleClick(object sender, MouseEventArgs e) { var hit = listView1.HitTest(e.Location); if (hit.SubItem != null) { TextBox txtEdit = new TextBox(); txtEdit.Bounds = hit.SubItem.Bounds; txtEdit.Text = hit.SubItem.Text; txtEdit.Leave += (s, ev) => { hit.SubItem.Text = txtEdit.Text; listView1.Controls.Remove(txtEdit); }; listView1.Controls.Add(txtEdit); txtEdit.Focus(); } } ``` ### 三、关键优化技巧 1. **列宽自适应** 使用`AutoResizeColumn`方法实现列宽自动调整: ```csharp listView1.Columns[0].Width = -2; // 自动适应内容 ``` 2. **数据持久化** 建议结合`BindingSource`组件实现数据绑定[^4]: ```csharp BindingSource source = new BindingSource(); source.DataSource = dataTable; listView1.DataSource = source; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值