【醒目】ListView 问题:巨难吗?(如果大家都认为巨难,分可以狂给!)

时间:2022-08-01 05:46:24
窗体上有一个LISTVIEW 和一个COMBOBOX,其中LISTVIEW的列头为
序号    类型      
1        a
2        b
3        c
......

combo 中有a,b,c,d,e五个选项。
选中一行时,例如2这一行,COMBOBOX出现在B的位置,通过选择COMBOBOX的选项 e ,就把b改写为e

问题是,如果LISTVIEW 宽度过大,或者ITEMS多到出现垂直滚动条时,拖动滚动条,COMBOBOX没发随着选中的ITEM跑。
我想到两个可能的解决办法:
1. 需要知道选择的项向上或下移动了多少才能让COMBBOX移动到正确的位置;
2. 捕捉到拖动滚动条这个事件,只要拖动了滚动条,COMBOBOX就隐藏掉,这样也稍微好看点!


请大家帮忙解决!
UP 有分!


有个文章,在LISTVIEW中加入COMBOBOX和TEXTBOX,但是类似的问题他没解决。
地址:http://dev.csdn.net/article/21/21801.shtm
问题:在有水平滚动条,或者垂直滚动条的情况下就有问题了,里面添加的EditBox,ComboBox没有跟着一起跑。

12 个解决方案

#1


MS做的东西有能跟着一起跑的吗?

#2


改Paint事件!

因为你的Listview的item,移动了,而相应的paint没改!

我猜是这样的!

#3


帮顶

#4


回复人: xxuu503(2005年CSDN MVH(Most Valuable Hemorrhoiders)) ( ) 信誉:100 

改Paint事件!
怎么改呢?继承,改写?

#5


在没有滚动条的情况下,定位combobox我试了没有问题
在有滚动条不滚动的情况下,定位也没有没有
一旦定了位,根据combo的值修改选中项的值也没有问题
就是在滚动的时候不跟着跑,我试了,在滚动的时候,窗体没有收到任何消息
就是说在.net自带的listview控件里实现自动跑估计不太可能或是我还没有找到好的办法

现在只能是你自写控件,继承listview,在控件中捕捉vscroll消息,制作vsroll事件。

private ListViewItem olditem=null; //存放选中之前的选中项

private void listView1_SelectedIndexChanged(object sender, System.EventArgs e)
{
if(this.listView1.SelectedItems.Count==0)
this.comboBox1.Visible=false;
else
{
//操作老item
if(this.olditem!=null)
{
olditem.SubItems[1].Text=this.comboBox1.Text;
}
//操作新item
ListViewItem lvi=this.listView1.SelectedItems[0];
//跑
Rectangle r=lvi.GetBounds(ItemBoundsPortion.Entire);
this.comboBox1.Location=new Point(r.Left+this.listView1.Columns[0].Width+this.listView1.Left+2,r.Top+this.listView1.Top);
this.comboBox1.Size=new Size(this.listView1.Columns[1].Width,r.Height);

this.comboBox1.Text=lvi.SubItems[1].Text;
this.comboBox1.Visible=true;
//写值老item
this.olditem=lvi;
}
}

#6


up

#7


我试了,在滚动的时候,窗体没有收到任何消息
........
你要知道这是的Message不是发给窗体的,是发给那个Listview的句柄的

建议看一下:MSDN的List-View Control Reference
里面有这个控件message及宏的定义!

#8


把Listview做成分页的,然后动态刷新。或者用API改写

#9


up!

#10


我想在滚动时就没有必要跟着跑了吧?如果滚动让combobox在listview的上方(top大于listview)时,不就要让combobox隐藏?那要花多少时间要实现啊??不如在combobox显示时,让listview不可滚动不是更好吗?

#11


只有重写控件,否则真的别无它法了。

#12


你的问题在 codeproject中有个例子
你在控件中搜索这个:ListViewEmbeddedControls

#1


MS做的东西有能跟着一起跑的吗?

#2


改Paint事件!

因为你的Listview的item,移动了,而相应的paint没改!

我猜是这样的!

#3


帮顶

#4


回复人: xxuu503(2005年CSDN MVH(Most Valuable Hemorrhoiders)) ( ) 信誉:100 

改Paint事件!
怎么改呢?继承,改写?

#5


在没有滚动条的情况下,定位combobox我试了没有问题
在有滚动条不滚动的情况下,定位也没有没有
一旦定了位,根据combo的值修改选中项的值也没有问题
就是在滚动的时候不跟着跑,我试了,在滚动的时候,窗体没有收到任何消息
就是说在.net自带的listview控件里实现自动跑估计不太可能或是我还没有找到好的办法

现在只能是你自写控件,继承listview,在控件中捕捉vscroll消息,制作vsroll事件。

private ListViewItem olditem=null; //存放选中之前的选中项

private void listView1_SelectedIndexChanged(object sender, System.EventArgs e)
{
if(this.listView1.SelectedItems.Count==0)
this.comboBox1.Visible=false;
else
{
//操作老item
if(this.olditem!=null)
{
olditem.SubItems[1].Text=this.comboBox1.Text;
}
//操作新item
ListViewItem lvi=this.listView1.SelectedItems[0];
//跑
Rectangle r=lvi.GetBounds(ItemBoundsPortion.Entire);
this.comboBox1.Location=new Point(r.Left+this.listView1.Columns[0].Width+this.listView1.Left+2,r.Top+this.listView1.Top);
this.comboBox1.Size=new Size(this.listView1.Columns[1].Width,r.Height);

this.comboBox1.Text=lvi.SubItems[1].Text;
this.comboBox1.Visible=true;
//写值老item
this.olditem=lvi;
}
}

#6


up

#7


我试了,在滚动的时候,窗体没有收到任何消息
........
你要知道这是的Message不是发给窗体的,是发给那个Listview的句柄的

建议看一下:MSDN的List-View Control Reference
里面有这个控件message及宏的定义!

#8


把Listview做成分页的,然后动态刷新。或者用API改写

#9


up!

#10


我想在滚动时就没有必要跟着跑了吧?如果滚动让combobox在listview的上方(top大于listview)时,不就要让combobox隐藏?那要花多少时间要实现啊??不如在combobox显示时,让listview不可滚动不是更好吗?

#11


只有重写控件,否则真的别无它法了。

#12


你的问题在 codeproject中有个例子
你在控件中搜索这个:ListViewEmbeddedControls