4

一連のコントロールをドラッグして、特定のタイプ (TextBoxes) のコントロールを選択できるようにしたいと考えています。

ドラッグ操作が完了したら、選択した各 TextBox に入力される値をユーザーに求める入力ボックスを表示します (はい、VB .dll を参照/使用する必要があります)。

これはできますか?(もちろんですが、どうやって?)

または、同じことを達成する別の方法はありますか (ユーザーが複数のコントロールをすばやく選択し、それらすべてに対して一度にアクションを実行できるようにする)?

更新しました:

私はこの種の作業を行っています.「警告」または「落とし穴」は、それが機能するためにユーザーに MessageBox.Show() をポップアップする必要があるということです. 基本的に、私は:

マウスの右ボタンが選択された場合、コンテナー (私の場合は FlowLayoutPanel) の MouseDown イベントでブール値を true に設定します。

マウスの右ボタンが選択された場合、コンテナーの MouseUp イベントで同じブール値を false に設定します。

次に、そのフォームのすべての TextBoxes に対して共有の MouseHover イベント ハンドラーを用意します。ブール値が true の場合、BackColor を (私の場合は Window から Gainsboro に) 変更します。

コンテナーの MouseUp イベントでは、InputBox (VB .dll の参照/インポート/使用) も使用して、"強調表示された" TextBox に共通の値をユーザーに入力するように要求します。次に、それらをループして、その BackColor を持つものを探し、ユーザーが指定した値をそれらの Text プロパティに代入します。

出来上がり!

残念ながら、TextBoxes の Modified プロパティは、この方法で値を割り当てても変更されないように見えるため、それを回避する必要があり (明示的に [保存] ボタンを有効に設定する)、複製するコードをさらに追加する必要がありました。ユーザーが入力する値を制限する KeyPressed コード。

したがって、少し厄介ではありますが、もちろん可能です。MessageBox.Show() が「バグ」なのか機能なのかはまだわかりませんが...

関連する投稿:なぜ MouseHover イベントは、messagebox.show() またはブレークポイントがその前に発生した場合にのみ呼び出されるのですか?

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 に答える