ListView没办法这样干,你用DataGirdView,单击就行了,ListView不能编辑
哎,哥们,我也不知道你是不是知道用这个DataGirdView控件,但就要的是题中所说的需求,ListView是一定不行的,写了挺长时间,能不能用得上,希望你读一下。
用DataGirdView大致可以这样实现(我没用三层,只给你说明作用):
1,在你的窗体上拽个DataGirdView出来,起名:如dgvQuestionList
2,在窗体后台代码文件中声明两个全局对象(因为在你修改的时候,还要用这两个对象,所以声明为全局的)
DataSet set = new DataSet("MyQuestion"); //用来存放查询结果
SqlDataAdapter sda = null; //ADONET查询的另一个对象,不知道你用过没有,查询的时候再初始化
3,搞一个查询按键也来超名:如btnSearch,写这个查询按钮的点击事件,具体处理如下:
string sql = "select from [yourtable] where [your condition]";
//初始化上边声明的SqlDataAdapter对象
thissda = new SqlAdapter(sql, con); //con是你的数据库连接,到时候换成你的连接对象就行了
thissdaFill(set,"Question"); //用sda去查询数据库,并把结果保存在上边声明的数据集里
dgvQuestionListDataSource = setTables["Question"]; //将查询结果显示到DataGridView上
以上是查询部分,下面说编辑
4,编辑的话,直接在DataGirdView控件上编辑就行了,关键是编辑完成后保存,你需要再来个按钮比如叫btnUpdate
处理这个更新按钮的点击事件,处理过程如下
SqlCommandBuilder builder = new SqlCommandBuilder(thissda); //把查询时用的SqlDataAdapter对象传过来,SqlCommandBuilder对象将自动为DataAdapter对象生成增删改语句
thissdaUpdate(set, "Question"); //记DataAdapter对象去执行更新
到此,解决,就是注意,数据库表里一定要有主键,否则不行了
不知道对你是否有帮助,有不明白的可以接着讨论。
<ListView GridColumn="0"
HorizontalAlignment="Stretch"
Name="lsv"
ItemsSource="{Binding}"> <!--这里说明数据来源,是绑定的-->
<ListViewView>
<GridView x:Name="grv">
<GridViewColumn Width="50"
DisplayMemberBinding="{Binding Column1}"//这个和aspnet里的意思是一样的
Header="Header1">
</GridViewColumn>
</GridView>
</ListViewView>
</ListView>
-------------------------------------------------------------
这是xaml
在后台给你的这个listview指定一个DataContext,貌似DataTable和List<obj>都可以。xaml里,Column1是字段名。如果是DataTable就是列名,如果是List<obj>就是对象属性名
lsvDataContext = dataTable;//类似的一句话
-------------------------------------------------------------
其实wpf在某些地方和aspnet相当的类似,这里的 *** 作方式不是和aspnet里面的GridView使用非常相似么
GetListViewItmeValue(introws, intcols)
在listview里面有这样的用法吗?你的程序不报错已是奇迹了。
listview不像datagridview或者datatable,
它的列不是用col来索引的,而是
listviewitem[itemindex]subitems[subitemindex]text
ListView我认为是种数据型的控件,以装载和展示数据为目的,当然也能展示,这个功能没有试过。这里讲一下ListView的第一次使用后的一些小结。ListView一些设置与添加字段。Lv1=newListView();//实例化Lv1GridLines=true;file://显示各个记录的分隔线Lv1FullRowSelect=true;file://要选择就是一行Lv1View=ViewDetails;file://定义列表显示的方式Lv1Scrollable=true;file://需要时候显示滚动条Lv1MultiSelect=false;//不可以多行选择listView1ItemsRemove(listView1SelectedItems[0]);//这样可以在ListView中删除选择的行Lv1HeaderStyle=ColumnHeaderStyleNonclickable;//针对数据库的字段名称,建立与之适应显示表头设置列名称:Lv1ColumnsAdd("A",60,HorizontalAlignmentRight);Lv1ColumnsAdd("B",100,HorizontalAlignmentLeft);Lv1ColumnsAdd("C",100,HorizontalAlignmentLeft);Lv1Visible=true;用循环把数据插入进ListView,用reader方法读取中括号中的字段名。lv1ItemsClear();//清空lv1中的记录ListViewItemli=newListViewItem();liSubItemsClear();//清空每行数据的每一列数据。foreach(DataRowreaderinstuRows)//前提是stu有数据,stu是DataTable{ListViewItemitem=newListViewItem((reader["EMP_NO"])ToString());itemSubItemsAdd(reader["NAME"]ToString());itemSubItemsAdd(reader["ID"]ToString());thislv1ItemsAdd(item);}接下来说说Listview中的一些小技巧。一、鼠标选中一行记录,如何读取那行记录中的某列记录??很简单用这句话:lv1SelectedItems[0]SubItems[0]TextSelectedItems[0]指的是你选中的行,如果你选中的是多行,那么第一行中括号里就是0,第二行就是1,以此类推。SubItems[0]指的是你选中的列,第一列中括号里就是0,第二行就是1,以此类推。二、Listview中双击记录事件。在cs文件里写:privatevoidlv1_DoubleClick(objectsender,EventArgse)//双击listview{//这里写你想要产生的事件。例如:MessageBoxShow("OK");}在Designercs文件里找到相关的控件代码写入如下信息:thislv1DoubleClick+=newSystemEventHandler(thislv1_DoubleClick);例如://lv1//thislv1Location=newSystemDrawingPoint(-3,98);thislv1Name="lv1";thislv1Size=newSystemDrawingSize(1018,527);thislv1TabIndex=28;thislv1UseCompatibleStateImageBehavior=false;thislv1View=SystemWindowsFormsViewDetails;thislv1DoubleClick+=newSystemEventHandler(thislv1_DoubleClick);三、Listview隐藏列有时候用Listview会遇到这样的麻烦。众所周知主键是区分每条不同记录最可靠的方法,一旦主键不显示在Listview中,那选中Listview某一行也就意味着在这一行中取不到这条记录的主键,只能取到其他显示的字段,那如何把这条记录传递给其他窗口呢?用其他字段?如果是这样的话就风险太大了,因为其他字段会有重复的可能,这样的程序就会出现BUG。这时候就该发挥隐藏列的作用了,隐藏列方便使用,其作用是在前台页面看不出有那条主键的字段,但是在代码控制中却包含了这个字段,我们点击某一条记录时就能方便的获取这条记录的主键字段,这样只要把这字段字符传到其他窗体就没问题了,因为主键字段是唯一且不能为空的。下面说说具体实现方法。Lv1ColumnsAdd("A",60,HorizontalAlignmentRight);Lv1ColumnsAdd("B",100,HorizontalAlignmentLeft);Lv1ColumnsAdd("C",100,HorizontalAlignmentLeft);Lv1Visible=true;foreach(DataRowreaderinstuRows)//前提是stu有数据,stu是DataTable{ListViewItemitem=newListViewItem((reader["EMP_NO"])ToString());itemSubItemsAdd(reader["NAME"]ToString());itemSubItemsAdd(reader["ID"]ToString());itemSubItemsAdd(reader["PrimaryKey"]ToString());thislv1ItemsAdd(item);}红色的是列的标题,白色的是循环输出每一行数据,这样可以很明显的看出,只有3列,却插入了4列的数据,而最后一列就是主键,而显示是也只有3列,那有人会问了,既然第四列没有显示,如何去第四列的数据呢?也是同样的代码:lv1SelectedItems[0]SubItems[3]Text这个3显示的就是第四列的数据,因为计算机是从0开始计数的,很简单吧!namespaceListViewExercise{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();ListViewSet();CreateViewItemMethodOne();//CreateViewItemMethodTow();}///ListView设置privatevoidListViewSet(){//ListView显示方式listViewControlView=ViewDetails;}/////手动填加ListView方法1privatevoidCreateViewItemMethodOne(){listViewControlBeginUpdate();#region增加Item的标题,共有三个列//1、创建标题listViewControlColumnsAdd("文件名");listViewControlColumnsAdd("大小");listViewControlColumnsAdd("创建日期");#endregion#region手动填加ListView方法//2、增加第一个Item,在ViewDetails模式下,有点像第一列中一个值listViewControlItemsAdd("folder1","文件夹1",0);//3、增加第一个Item的第一个SubItem,在ViewDetails模式下,有点像第一列中一个值listViewControlItems["folder1"]SubItemsAdd("11");//增加第一个Item的第二个SubItem,在ViewDetails模式下,有点像第一列中一个值listViewControlItems["folder1"]SubItemsAdd("20080114");listViewControlItemsAdd("folder2","文件夹2",0);listViewControlItems["folder2"]SubItemsAdd("21");listViewControlItems["folder2"]SubItemsAdd("20080115");listViewControlItemsAdd("文件夹3");listViewControlItemsAdd("文件夹4");#endregionlistViewControlEndUpdate();}///手动填加ListView方法2privatevoidCreateViewItemMethodTow(){#region增加Item的标题,共有三个列//1、创建标题,共三列listViewControlColumnsAdd("文件名");listViewControlColumnsAdd("大小");listViewControlColumnsAdd("创建日期");#endregionlistViewControlBeginUpdate();#region增加第一个Item//2、定义一个ListViewItem,在ViewDetails模式下,有点像第一列中一个值ListViewItemlvItem;//3、定义ListViewSubItem,在ViewDetails模式下,有点像第二列中一个值ListViewItemListViewSubItemlvSubItem;//实列化一个Item,在ViewDetails模式下,有点像加第一行的第一个值lvItem=newListViewItem();//Item的显示的文字lvItemText="文件夹1";//4、Item增加到ListView控件中,即增加第一行。在ViewDetails模式下,有点像增加了第一个项目的第一列的第一个值listViewControlItemsAdd(lvItem);//实例化SubItemlvSubItem=newListViewItemListViewSubItem();lvSubItemText="10";//5、将SubItem增加到第一个Item中,在ViewDetails模式下,有点像增加了第一个项目的第二列的第一个值lvItemSubItemsAdd(lvSubItem);lvSubItem=newListViewItemListViewSubItem();lvSubItemText="20080114";//将SubItem增加到第一个Item中,在ViewDetails模式下,有点像增加了第一个项目的第三列的第一个值lvItemSubItemsAdd(lvSubItem);#endregion#region增加第二个ItemlvItem=newListViewItem();lvItemText="文件夹2";lvSubItem=newListViewItemListViewSubItem();lvSubItemText="20";lvItemSubItemsAdd(lvSubItem);lvSubItem=newListViewItemListViewSubItem();lvSubItemText="20080115";lvItemSubItemsAdd(lvSubItem);listViewControlItemsAdd(lvItem);#endregionlistViewControlEndUpdate();}//第三种自己的方法,挺有效的,简单的privatevoidCreateViewItems(){listView1BeginUpdate();listView1ColumnsAdd("矩阵控制命令");listView1ColumnsAdd("功能描述");listView1Columns[0]Width=145;listView1Columns[1]Width=515;listView1ItemsAdd("/%Lock;");listView1Items[0]SubItemsAdd("锁定键盘");listView1ItemsAdd("/%Unlock;");listView1Items[1]SubItemsAdd("解开键盘的锁定");listView1ItemsAdd("/Version;");listView1Items[2]SubItemsAdd("查询软件版本");listView1ItemsAdd("/:BellOff;");listView1Items[3]SubItemsAdd("关闭蜂鸣器");listView1EndUpdate();}}}
以上就是关于c# 如何双击listview 的项可变成编辑状态全部的内容,包括:c# 如何双击listview 的项可变成编辑状态、wpf中listview控件的使用、c#下读取外部程序listview控件,已经取得行数,但读出内容为空值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)