treeview的问题,解决后200分相送,决不食言!

solidpanther 2005-03-03 11:16:11
我想实现如下功能 :
1,用鼠标点treeview里的某个结点,不放鼠标,移动鼠标后,鼠标所到之处都被选中(或者变蓝),
2,当我用ctrl键时,用鼠标能点选某些不连续的结点
有别的控件也可以,不一定是treeview,大家帮帮忙,谢谢!
...全文
350 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
royluok 2005-03-08
  • 打赏
  • 举报
回复
只是给你一个思路,以此为基础再增加一下拖动的效果就不难了,不过要花一定时间去调试.写上面的代码不知不觉就花了我几个小时啊..
terryshi 2005-03-04
  • 打赏
  • 举报
回复
欧~好复杂~
royluok 2005-03-04
  • 打赏
  • 举报
回复
改了一下,应该满足你的两大要求,看看合不合适吧.

Public Class FrmTest
Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents TreeView1 As System.Windows.Forms.TreeView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.TreeView1 = New System.Windows.Forms.TreeView
Me.SuspendLayout()
'
'TreeView1
'
Me.TreeView1.BackColor = System.Drawing.SystemColors.Window
Me.TreeView1.ImageIndex = -1
Me.TreeView1.Location = New System.Drawing.Point(8, 8)
Me.TreeView1.Name = "TreeView1"
Me.TreeView1.SelectedImageIndex = -1
Me.TreeView1.Size = New System.Drawing.Size(384, 320)
Me.TreeView1.TabIndex = 0
'
'FrmTest
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(400, 334)
Me.Controls.Add(Me.TreeView1)
Me.KeyPreview = True
Me.Name = "FrmTest"
Me.Text = "FrmTest"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub FrmTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim node As New TreeNode("all")
Dim i As Int16
For i = 0 To 10
node.Nodes.Add(i.ToString)
Next
Me.TreeView1.Nodes.Add(node)
End Sub

Dim beginPoint, endPoint As Point
Dim SelectNodeIndex As New ArrayList
Dim mouse_Down As Boolean = False
Dim mouse_Drag As Boolean = False
Dim IsFristSelect As Boolean = True
Dim CtrlKeyDown As Boolean = False
Dim NodeTemp As TreeNode

Private Sub TreeView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown
beginPoint = Me.TreeView1.PointToClient(Me.MousePosition)
mouse_Down = True
ClearSelectNode()
If CtrlKeyDown Then
NodeTemp = Me.TreeView1.SelectedNode
End If
End Sub

Private Sub TreeView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseMove
If mouse_Down Then
mouse_Drag = True
End If
End Sub

Private Sub TreeView1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseUp
If mouse_Drag Then
endPoint = Me.TreeView1.PointToClient(Me.MousePosition)
SelectNode(GetRect(beginPoint, endPoint))
ElseIf CtrlKeyDown Then
NodeTemp.BackColor = System.Drawing.SystemColors.Highlight
Dim nd As TreeNode = Me.TreeView1.GetNodeAt(Me.TreeView1.PointToClient(Me.MousePosition))
If Not nd Is Nothing Then
nd.BackColor = System.Drawing.SystemColors.Highlight
End If
End If
mouse_Drag = False
mouse_Down = False
End Sub

Private Function GetRect(ByVal BeginP As Point, ByVal EndP As Point) As Drawing.Rectangle
'根据鼠标按下时所在的位置和释放时的位置计算出矩形
Dim f As New Drawing.Rectangle
f.Width = Math.Abs(EndP.X - BeginP.X)
f.Height = Math.Abs(EndP.Y - BeginP.Y)
If BeginP.X < EndP.X Then
f.X = BeginP.X
Else
f.X = EndP.X
End If
If BeginP.Y < EndP.Y Then
f.Y = BeginP.Y
Else
f.Y = EndP.Y
End If
Return f
End Function

Private Sub SelectNode(ByVal Rect As Rectangle)
IsFristSelect = True
Dim node As TreeNode
For Each node In Me.TreeView1.Nodes
SelectNode(Rect, node)
Next
End Sub

Private Sub SelectNode(ByVal p As Point)

End Sub
Private Sub SelectNode(ByVal Rect As Rectangle, ByVal node As TreeNode)
Dim nd As TreeNode
For Each nd In node.Nodes
If nd.IsVisible Then
If nd.Bounds.IntersectsWith(Rect) Then '检查此节点是否在鼠标拖出的矩形之内
If IsFristSelect Then
Me.TreeView1.SelectedNode = nd
IsFristSelect = False
Else
nd.BackColor = System.Drawing.SystemColors.Highlight
End If
Else
nd.BackColor = System.Drawing.SystemColors.Window
End If
SelectNode(Rect, nd)
End If
Next
End Sub

Private Sub ClearSelectNode()
If CtrlKeyDown = False Then
Dim node As TreeNode
For Each node In Me.TreeView1.Nodes
ClearSelectNode(node)
Next
End If
End Sub

Private Sub ClearSelectNode(ByVal Node As TreeNode)
Dim nd As TreeNode
For Each nd In Node.Nodes
If nd.IsVisible And nd.IsSelected = False Then
nd.BackColor = Color.FromName("Window")
End If
Next
End Sub

Private Sub FrmTest_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
If e.KeyCode = Keys.ControlKey Then
CtrlKeyDown = True
End If
End Sub

Private Sub FrmTest_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp
If e.KeyCode = Keys.ControlKey Then
CtrlKeyDown = False
End If
End Sub
End Class
royluok 2005-03-04
  • 打赏
  • 举报
回复
按你的要求做了一个测试,已经通过.
给分吧.
Public Class FrmTest
Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents TreeView1 As System.Windows.Forms.TreeView
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.TreeView1 = New System.Windows.Forms.TreeView
Me.SuspendLayout()
'
'TreeView1
'
Me.TreeView1.BackColor = System.Drawing.SystemColors.Window
Me.TreeView1.ImageIndex = -1
Me.TreeView1.Location = New System.Drawing.Point(8, 8)
Me.TreeView1.Name = "TreeView1"
Me.TreeView1.SelectedImageIndex = -1
Me.TreeView1.Size = New System.Drawing.Size(384, 320)
Me.TreeView1.TabIndex = 0
'
'FrmTest
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(400, 334)
Me.Controls.Add(Me.TreeView1)
Me.Name = "FrmTest"
Me.Text = "FrmTest"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub FrmTest_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim node As New TreeNode("all")

Dim i As Int16
For i = 0 To 10
node.Nodes.Add(i.ToString)
Next
Me.TreeView1.Nodes.Add(node)
End Sub

Dim beginPoint, endPoint As Point
Dim SelectNodeIndex As New ArrayList
Dim mouse_Down As Boolean = False
Dim mouse_Drag As Boolean = False
Dim IsFristSelect As Boolean = True

Private Sub TreeView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown
beginPoint = Me.TreeView1.PointToClient(Me.MousePosition)
mouse_Down = True
ClearSelectNode()
End Sub

Private Sub TreeView1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseMove
If mouse_Down Then
mouse_Drag = True
End If
End Sub

Private Sub TreeView1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseUp
If mouse_Down And mouse_Drag Then
endPoint = Me.TreeView1.PointToClient(Me.MousePosition)
SelectNode(GetRect(beginPoint, endPoint))
End If
mouse_Drag = False
mouse_Down = False
End Sub

Private Function GetRect(ByVal BeginP As Point, ByVal EndP As Point) As Drawing.Rectangle
'根据鼠标按下时所在的位置和释放时的位置计算出矩形
Dim f As New Drawing.Rectangle
f.Width = Math.Abs(EndP.X - BeginP.X)
f.Height = Math.Abs(EndP.Y - BeginP.Y)
If BeginP.X < EndP.X Then
f.X = BeginP.X
Else
f.X = EndP.X
End If
If BeginP.Y < EndP.Y Then
f.Y = BeginP.Y
Else
f.Y = EndP.Y
End If
Return f
End Function

Private Sub SelectNode(ByVal Rect As Rectangle)
IsFristSelect = True
Dim node As TreeNode
For Each node In Me.TreeView1.Nodes
SelectNode(Rect, node)
Next
End Sub

Private Sub SelectNode(ByVal Rect As Rectangle, ByVal node As TreeNode)
Dim nd As TreeNode
For Each nd In node.Nodes
If nd.IsVisible Then
If nd.Bounds.IntersectsWith(Rect) Then '检查此节点是否在鼠标拖出的矩形之内
Me.SelectNodeIndex.Add(nd.Index)
If IsFristSelect Then
Me.TreeView1.SelectedNode = nd
IsFristSelect = False
Else
nd.BackColor = System.Drawing.SystemColors.Highlight
End If
Else
nd.BackColor = System.Drawing.SystemColors.Window
End If
SelectNode(Rect, nd)
End If
Next
End Sub

Private Sub ClearSelectNode()
Dim node As TreeNode
For Each node In Me.TreeView1.Nodes
ClearSelectNode(node)
Next
End Sub

Private Sub ClearSelectNode(ByVal Node As TreeNode)
Dim nd As TreeNode
For Each nd In Node.Nodes
If nd.IsVisible Then
nd.BackColor = Color.FromName("Window")
End If
Next
End Sub
End Class
jialuo 2005-03-04
  • 打赏
  • 举报
回复
如果你说的第一个问题是鼠标拖动的效果
我或许可以给你解决这两个问题
solidpanther 2005-03-04
  • 打赏
  • 举报
回复
我先回去试一下啊,您再看看是否能做完善一点?
solidpanther 2005-03-04
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView.asp?id=3824448
solidpanther 2005-03-04
  • 打赏
  • 举报
回复
不错,呵呵,不过鼠标拉动的时候并没显示已经选择什么,不是很完善,期待,
先另给royluok(roy lu)
100分可以不?
zhangzhiwei 2005-03-03
  • 打赏
  • 举报
回复
up!!
sutalon 2005-03-03
  • 打赏
  • 举报
回复
帮你顶

实在不会做
huangyan168168 2005-03-03
  • 打赏
  • 举报
回复
学习
tmeteor 2005-03-03
  • 打赏
  • 举报
回复
按你的要求做了一个简单的,关于ctrl键的你自已扩展一下,应该不难.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace DataManagement
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TreeView treeView1;
private ArrayList selectedNodesArr=new ArrayList ();
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.treeView1 = new System.Windows.Forms.TreeView();
this.SuspendLayout();
//
// treeView1
//
this.treeView1.ImageIndex = -1;
this.treeView1.Location = new System.Drawing.Point(80, 48);
this.treeView1.Name = "treeView1";
this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("所有项")});
this.treeView1.SelectedImageIndex = -1;
this.treeView1.Size = new System.Drawing.Size(168, 97);
this.treeView1.TabIndex = 0;
this.treeView1.MouseEnter += new System.EventHandler(this.treeView1_MouseEnter);
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
this.treeView1.MouseLeave += new System.EventHandler(this.treeView1_MouseLeave);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.treeView1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion


[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
for(int i=0;i<10;i++)
{

this.treeView1 .Nodes [0].Nodes .Add (new TreeNode ("SubNode"+i.ToString ()));
}


}

private void treeView1_MouseEnter(object sender, System.EventArgs e)
{
selectedNodesArr.Clear ();
}

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
selectedNodesArr.Add (e.Node.Index);
}

private void treeView1_MouseLeave(object sender, System.EventArgs e)
{
foreach(object item in selectedNodesArr)
{
treeView1.Nodes [0].Nodes [Convert.ToInt32(item)].BackColor =Color.Blue;
}
}
}
}
yeke888 2005-03-03
  • 打赏
  • 举报
回复
。。。路过
wokagoka 2005-03-03
  • 打赏
  • 举报
回复
关注……
bthl 2005-03-03
  • 打赏
  • 举报
回复
DDDD!
solidpanther 2005-03-03
  • 打赏
  • 举报
回复
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。
内容概要:本文围绕双机并联虚拟同步发电机(VSG)在微电网中的功率分配、黑启动、虚拟阻抗与预同步控制展开,基于Simulink平台构建了完整的微电网系统仿真模型。重点研究了VSG在双机并联运行下的有功/无功功率均分控制策略,通过引入虚拟阻抗技术有效解决了因线路阻感比差异导致的功率分配不均问题。同时,设计了微电网黑启动流程与并网预同步控制模块,实现了待并网系统与主网在电压幅值、频率和相位上的精确同步,显著降低了并网冲击电流。系统整合了VSG控制、下垂控制、虚拟阻抗、锁相环(PLL)及预同步逻辑等关键环节,全面验证了多VSG协同运行的稳定性、自主恢复能力与并网可靠性。; 适合人群:具备电力系统、电力电子及自动控制等相关专业知识,从事微电网、分布式发电、VSG控制与并网技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解双机并联VSG系统中功率分配不均的机理及虚拟阻抗的补偿作用;②掌握微电网黑启动全过程及预同步控制的关键技术要点;③学习并实践基于Simulink的微电网多层次、多目标控制策略的建模与仿真方法;④为相关科研课题、毕业设计或实际工程项目提供可复现、可拓展的技术方案与仿真参考。; 阅读建议:建议结合提供的Simulink模型文件进行同步学习,重点关注VSG控制参数整定、虚拟阻抗设计原则、预同步切换逻辑等核心模块的实现细节,并可通过改变负载投切、线路参数或初始频率偏差等条件进行多工况仿真测试,以深入探究系统的动态响应特性与鲁棒性。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧