问题描述
C#Winform中放了一个listview里放了多个按钮,上下拉动滚动条按钮没有随着文字上下拉动,只有文字上下拉动!我在listview里面绑定了很多行的数据,每一行都有按钮,然而当我上下滚动屏幕的时候发现,除了文字可以上下滚动,按钮就在那里一动不动,拉下去的时候,按钮点出来的信息还是前面几行的数据,某一个按钮的Tag的值还是前面几行的Tag的值,请问上下拖动时,怎么让按钮也随着文字一样上下滚动,按钮的Tag还是原来的那一行的Tag。
解决方案
本帖最后由 hzxs1000 于 2014-12-27 15:46:02 编辑
解决方案二:
listView是重写的吧
解决方案三:
引用1楼duanzi_peng的回复:
listView是重写的吧
是啊,用代码画出了表哥线和一下数据,直接绑定的usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Drawing;usingSystem.Net;usingSystem.Data;usingSystem.Data.SqlClient;usingfmlistener.utils;usingfmlistener.entity;usingfmlistener.referecce;usingRestSharp;usingfmlistener.http;namespacefmlistener.view{classListViewManager{privateSystem.Windows.Forms.ListViewlistview;privatestringsection;publicListViewManager(System.Windows.Forms.ListViewlistview){//TODO:Completememberinitializationthis.listview=listview;this.listview.Tag=this;}publicListViewManager(System.Windows.Forms.ListViewlistview,stringsection){this.listview=listview;this.section=section;this.listview.Tag=this;}internalvoidinit(){doInitListView(this.listview,this.section);}privatestaticvoiddoInitListView(ListViewlv,stringsection){lv.Clear();lv.GridLines=true;//显示各个记录的分隔线lv.FullRowSelect=true;//要选择就是一行lv.View=View.Details;//定义列表显示的方式lv.Scrollable=true;//需要时候显示滚动条lv.MultiSelect=true;//允许多行选择//lv.CheckBoxes=true;lv.Font=newFont("楷体",14,FontStyle.Regular);//实例化ini操作类IniOperatecfg=newIniOperate(R.VIEW_CONFIG_PATH);//初始化ListViewOpt类,buildOpts(参数为分割过的string数组)函数用来获取ini文件中的Name,Width,Index数据stringstropts=cfg.IniReadValue("ViewConfig",section);if(stropts!=null&&stropts!=""){ListViewOpt[]opts=parseOpts(cfg.IniReadValue("ViewConfig",section).Split(R.CONTENT_SPLIT_CHAR));//遍历ListViewOpts数组,取name,widthforeach(ListViewOptoptinopts){//获取name和width用来绘制之后的headerstringname=opt.Name;intwidth=opt.Width;ColumnHeaderheader=lv.Columns.Add(name,width,HorizontalAlignment.Left);//把ListViewOpt的数据与ColumnHeader的数据绑定header.Tag=opt;}}lv.Visible=true;}//返回ListVietOpt[]数组,存有Name,Width,Index数据privatestaticListViewOpt[]parseOpts(string[]strOpts){//这里需要处理异常ListViewOpt[]opts=newListViewOpt[strOpts.Length];for(inti=0;i<strOpts.Length;i++){string[]fields=strOpts[i].Split(R.CONTENT_COMMA_CHAR);stringname=fields[0];intwidth=Convert.ToInt32(fields[1]);ListViewOptopt=newListViewOpt(name,width,i);opts[i]=opt;}returnopts;}internalvoidhideCol(ColumnWidthChangingEventArgse){ColumnHeaderch=this.listview.Columns[e.ColumnIndex];ListViewOptopt=(ListViewOpt)ch.Tag;if(opt.Hide){e.Cancel=true;e.NewWidth=0;}}publicvoidupdateListViewOpts(){//组织opts数据ListViewOptopt=newListViewOpt();StringBuildersb=newStringBuilder();boolfirstenter=true;SortedDictionary<int,ColumnHeader>sortedChs=newSortedDictionary<int,ColumnHeader>();foreach(ColumnHeaderchinthis.listview.Columns){sortedChs.Add(ch.DisplayIndex,ch);}foreach(ColumnHeaderchinsortedChs.Values){opt=(ListViewOpt)ch.Tag;if(firstenter){sb.Append(opt.Name+","+ch.Width+","+opt.Hide);firstenter=false;}else{sb.Append("|"+opt.Name+","+ch.Width+","+opt.Hide);}//写入configIniOperatecfg=newIniOperate(R.VIEW_CONFIG_PATH);cfg.IniWriteValue("ViewConfig","listViewItems",sb.ToString());}}}}
解决方案四:
你得重写,不是直接拖上去就好了的啊
解决方案五:
引用3楼wjq的回复:
你得重写,不是直接拖上去就好了的啊
具体的方法要怎么写
解决方案六:
我用的是Buttonbtn=newButton();this.listview1.Controls.Add(btn);
解决方案七:
你现在其实按钮是按钮,listview是listview,他俩没有关联起来要么代码在滚动条滚动事件里判断第一行显示的是哪一行数据,然后重新加载按钮要么直接重写listview,把按钮和行真正的关联起来否则listview动了,按钮不重绘,保证是不一致了
解决方案八:
直接用DatagridView吧