C#WINFORM中listview里多行按钮不能和文字一样上下滚动

问题描述

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吧

时间: 2024-10-30 20:22:43

C#WINFORM中listview里多行按钮不能和文字一样上下滚动的相关文章

applytransformation-android 中 listview实现展开行项效果时出现的问题

问题描述 android 中 listview实现展开行项效果时出现的问题 如题,具体方法网上都有,就是利用动画,将行项的高度,在规定时间内叠加或递减,applyTransformation 的参数会从0到1递增,可以在这里实现自己的操作. 问题是,写完代码后,除了最后一行之外,其他行的展开和收起都没有问题 打了断点看了一下,当操作最后一行时,applyTransformation的interpolatedTime参数一直是0.0,而不是叠加的过程. 大家之前有没有遇到类似的情况,请指教一下 解

winform中listview显示问题

问题描述 winform中listview显示问题 20C 为何第二次点击才显示第一次添加的内容 private void button7_Click(object sender EventArgs e) { if (this.textBox7.Text == """" || this.textBox8.Text == """" || this.comboBox2.Text == """"

C# winform 中listview 使用了checkbox 然后用group分了栏

问题描述 C# winform 中listview 使用了checkbox 然后用group分了栏 怎么点击分栏的Header来勾选每个组别内的内容,或者获取Header的点击事件(Group的Header),谢谢大神们 解决方案 C# Winform ListView使用ListView中使用CheckBox 解决方案二: 解决方案三:

winform中,代码里用画线DrawLines连接几个pictures,然后要实现整体缩小放大

问题描述 winform中,拖了一个panel在form上,放了五个picturebox,然后在panel1_Paint事件里画线DrawLines连接五个pictures,有两个缩小放大按钮,点击缩小,实现整体等比例缩小,点击放大,实现等比例放大,并整体位置改变,怎么实现///<summary>///画图///</summary>///<paramname="sender"></param>///<paramname="

winform 中 listview 怎么更改组名

问题描述 如题,我在listview里添加了一组(手动添加的),组名显示Default怎么改了啊,请大家帮忙给看看啊 解决方案 解决方案二:设置一下属性即可了.解决方案三:???什么属性啊,~我第一次用没找着~解决方案四:listView1.Groups.Clear();把它清除了解决方案五:动态创建组:ListViewGroupaa=newListViewGroup();aa.Name="Default";listView1.Groups.Add(aa);解决方案六:不知道你添没添加

求救 !!! winform 中 listview 传值问题

问题描述 我双击listview中的某一项,然后在另一个页面把双击那一项的信息显示出来(最好能给代码) 解决方案 解决方案二:privatevoidlistView1_DoubleClick(objectsender,EventArgse){Formf=newForm();f.Show();Graphicsg=f.CreateGraphics();for(inti=0;i<listView1.SelectedItems[0].SubItems.Count;i++){g.DrawString(li

.NET的winform中listview的绑定

         private void FrmXMLShow_Load(object sender, EventArgs e)         {             // listview样式设置             listView1.GridLines = true;             listView1.FullRowSelect = true;             listView1.View = View.Details;             listVie

winform中listview的绑定

 private void FrmXMLShow_Load(object sender, EventArgs e)         {             // listview样式设置             listView1.GridLines = true;             listView1.FullRowSelect = true;             listView1.View = View.Details;             listView1.Scrol

listview里子项有按钮的情况使用介绍_Android

你自定义按钮: 复制代码 代码如下: public class MyButton extends Button { public DontPressWithParentImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setPressed(boolean pressed) { // If the parent is pressed, do not set