gpt4 book ai didi

c# - 如何通过鼠标拖动来选择多个控件

转载 作者:太空狗 更新时间:2023-10-30 00:26:37 31 4
gpt4 key购买 nike

我希望能够拖过一堆控件并选择特定类型的控件(文本框)。

拖动操作完成后,我想显示一个输入框(是的,我必须引用/使用 VB .dll)提示用户输入将在每个选定文本框中输入的值。

这能做到吗? (当然,但如何?)

或者是否有另一种方法可以完成同样的事情(允许用户快速选择多个控件,然后同时对所有控件执行操作)?

更新:

我有这种工作 - “警告”或“陷阱”是我必须向用户弹出 MessageBox.Show() 才能工作。本质上,我:

如果选择了鼠标右键,则在容器(在我的例子中是 FlowLayoutPanel)的 MouseDown 事件上将 bool 值设置为 true。

如果选择了鼠标右键,则在容器的 MouseUp 事件中将相同的 bool 值设置为 false。

然后,我为该表单上的所有 TextBox 提供了一个共享的 MouseHover 事件处理程序,如果 bool 值为真,则更改背景颜色(在我的例子中,从 Window 更改为 Gainsboro)。

在容器的 MouseUp 事件中,我还使用 InputBox(引用/导入/使用 VB .dll)请求用户输入“高亮显示”文本框通用的值。然后我遍历它们,寻找具有该 BackColor 的那些,并将用户提供的值赋给它们的 Text 属性。

瞧!

不幸的是,当您以这种方式给它赋值时,TextBoxes 的 Modified 属性似乎没有改变,所以我不得不解决这个问题(明确地将“保存”按钮设置为启用),并且我不得不添加更多代码复制我的 KeyPressed 代码,它限制了用户输入的值。

所以,这当然是可能的,尽管有点笨拙。不过,我还不确定 MessageBox.Show() 是“错误”还是功能......

相关帖子是:Why does MouseHover event only get called if a messagebox.show() or breakpoint occurs before it?

最佳答案

这个其实很简单。我假设通过拖动你的意思是你想要“选择”控件,例如你会在绘画程序中“选择”一些像素。这是我写给您的一个示例,它就是这样做的,并且只选择 TextBox 控件。它会忽略其他控件。

namespace WindowsFormsApplication5
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

/// <summary>
/// Main application form
/// </summary>
public partial class Form1 : Form
{
/// <summary>
/// Initializes a new instance of the WindowsFormsApplication5.Form1 class
/// </summary>
public Form1() {
InitializeComponent();
DoubleBuffered = true;
}

private Point selectionStart;
private Point selectionEnd;
private Rectangle selection;
private bool mouseDown;

private void GetSelectedTextBoxes() {
List<TextBox> selected = new List<TextBox>();

foreach (Control c in Controls) {
if (c is TextBox) {
if (selection.IntersectsWith(c.Bounds)) {
selected.Add((TextBox)c);
}
}
}

// Replace with your input box
MessageBox.Show("You selected " + selected.Count + " textbox controls.");
}

protected override void OnMouseDown(MouseEventArgs e) {
selectionStart = PointToClient(MousePosition);
mouseDown = true;
}

protected override void OnMouseUp(MouseEventArgs e) {
mouseDown = false;

SetSelectionRect();
Invalidate();

GetSelectedTextBoxes();
}

protected override void OnMouseMove(MouseEventArgs e) {
if (!mouseDown) {
return;
}

selectionEnd = PointToClient(MousePosition);
SetSelectionRect();

Invalidate();
}

protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);

if (mouseDown) {
using (Pen pen = new Pen(Color.Black, 1F)) {
pen.DashStyle = DashStyle.Dash;
e.Graphics.DrawRectangle(pen, selection);
}
}
}

private void SetSelectionRect() {
int x, y;
int width, height;

x = selectionStart.X > selectionEnd.X ? selectionEnd.X : selectionStart.X;
y = selectionStart.Y > selectionEnd.Y ? selectionEnd.Y : selectionStart.Y;

width = selectionStart.X > selectionEnd.X ? selectionStart.X - selectionEnd.X : selectionEnd.X - selectionStart.X;
height = selectionStart.Y > selectionEnd.Y ? selectionStart.Y - selectionEnd.Y : selectionEnd.Y - selectionStart.Y;

selection = new Rectangle(x, y, width, height);
}
}
}

目前对此有限制。显而易见的是,这不会在嵌套容器控件(例如,包含文本框的表单面板)中选择文本框。如果是这种情况,选择将绘制在面板下方,并且不会选择 TextBox,因为我编写的代码不检查嵌套容器。

不过,您可以轻松地更新代码来完成所有这些操作,但这应该会给您一个坚实的开端。

关于c# - 如何通过鼠标拖动来选择多个控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10308906/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com