4

我希望能够拖动一堆控件并选择某种类型的控件(文本框)。

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

这可以做到吗?(当然,但是如何?)

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

更新:

我已经完成了这种工作——“警告”或“陷阱”是我必须向用户弹出 MessageBox.Show() 才能使其工作。本质上,我:

如果选择了鼠标右键,则在容器的(在我的情况下为 FlowLayoutPanel)MouseDown 事件上将布尔值设置为 true。

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

然后,我为该表单上的所有 TextBox 提供了一个共享的 MouseHover 事件处理程序,如果布尔值为 true,则更改 BackColor(在我的情况下,从 Window 更改为 Gainsboro)。

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

瞧!

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

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

一个相关的帖子是:为什么只有在 messagebox.show() 或断点发生之前才调用 MouseHover 事件?

4

1 回答 1

11

这实际上非常简单。我假设通过拖动您的意思是您想要“选择”控件,例如您将在绘画程序中“选择”一些像素。这是我写给你的一个例子,它就是这样做的,只选择 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(例如,表单上包含 TextBox 的面板)。如果是这种情况,将在面板下方绘制选择,并且不会选择 TextBox,因为我编写的代码不会检查嵌套容器。

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

于 2012-04-25T19:08:37.467 回答