0

C# で小さなアプリケーションを開発していますが、イベントに問題があります。私のフォームには、アプリケーションの現在の状態を説明する controlState プロパティがあります。アプリケーションが SEARCH 状態にあるときに Enter キーを押すと、KeyDown_Search と KeyDown_Idle メソッドの両方が実行されます。MessageBox.Show("anything"); を追加すると KeyDown_eventManager の最後に問題は存在しません - KeyDown_Search メソッドのみを実行します。
この問題を解決するにはどうすればよいですか?

enum ControlState {NO_SHOW, IDLE, SEARCH}

private ControlState controlState;

protected override void OnShown(EventArgs e)
{
  this.controlState = ControlState.IDLE;
  this.KeyDown += new KeyEventHandler(KeyDown_eventManager);
}

void KeyDown_eventManager(object sender, KeyEventArgs e)
{
  switch (this.controlState)
  {
    case ControlState.SEARCH:
      this.KeyDown_Search(sender, e);
      break;
    case ControlState.NO_SHOW:
    case ControlState.IDLE:
      this.KeyDown_Idle(sender, e);
      break;
  }
}

void KeyDown_Search(object sender, KeyEventArgs e)
{
  switch (e.KeyCode)
  {
    case Keys.Enter:
      this.textContent = this.db.searchList(this.textSearch);
      this.textSearch = null;
      this.controlState = ControlState.IDLE;
      break;
  }
  this.draw();
}

void KeyDown_Idle(object sender, KeyEventArgs e)
{
  switch (e.KeyCode)
  {
    case Keys.Enter:
      this.controlState = ControlState.NO_SHOW;
      break;
  }
  this.draw();
}

更新: すべてのアプリケーション コードを追加します。たぶん、解決策を見つけるのに役立ちます。

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 dbConnector;
using DX = Microsoft.DirectX;
using D3D = Microsoft.DirectX.Direct3D;

namespace dbConnector
{
    public class dbText
    {
        public dbText()
        {

        }

        public string searchList(string keyword)
        {
            return "there will be connection to db";
        }
    }
}

namespace Rzutnik
{
    enum ControlState
    {
        NO_SHOW, IDLE, SEARCH
    }

    public partial class Display : Form
    {
        private D3D.Device device;
        private dbText db;
        private ControlState controlState;
        private D3D.Font textFont;
        private D3D.Font textSearchFont;
        private Rectangle textRect;
        private int textPosition;
        private bool textScrollingUp;
        private int textJump;
        private Timer textScrollingTimer;
        private Timer textAutocomplete;
        private int textScrollingTimerInterval;
        private string textContent;
        private string textSearch = null;

        public Display()
        {
            InitializeComponent();
            this.controlState = ControlState.IDLE;
            this.InitializeDb();
            this.InitializeDevice();
            this.textInitialize();
            this.KeyDown += new KeyEventHandler(KeyDown_eventManager);
            this.KeyUp += new KeyEventHandler(KeyUp_eventManager);
            this.KeyPress += new KeyPressEventHandler(KeyPress_eventManager);
            this.Paint += new PaintEventHandler(DisplayPaint);
            this.ResizeEnd += new EventHandler(DisplayResizeEnd);
        }

        protected void InitializeDb()
        {
            this.db = new dbText();
        }

        protected void InitializeDevice()
        {
            D3D.PresentParameters presentParams = new D3D.PresentParameters();
            presentParams.BackBufferFormat = D3D.Format.R5G6B5;
            presentParams.Windowed = true;
            presentParams.SwapEffect = D3D.SwapEffect.Discard;

            this.device = new D3D.Device(0, D3D.DeviceType.Hardware, this, D3D.CreateFlags.SoftwareVertexProcessing, presentParams);
        }

        void KeyDown_eventManager(object sender, KeyEventArgs e)
        {
            switch (this.controlState)
            {
                case ControlState.SEARCH:
                    this.KeyDown_Search(sender, e);
                    break;
                case ControlState.NO_SHOW:
                    this.KeyDown_Idle(sender, e);
                    break;
                case ControlState.IDLE:
                    this.KeyDown_Idle(sender, e);
                    break;
            }

            //MessageBox.Show("anything");
        }

        void KeyUp_eventManager(object sender, KeyEventArgs e)
        {
            switch (this.controlState)
            {
                case ControlState.NO_SHOW:
                case ControlState.IDLE:
                    this.KeyUp_Idle(sender, e);
                    break;
            }
        }

        void KeyPress_eventManager(object sender, KeyPressEventArgs e)
        {
            switch (this.controlState)
            {
                case ControlState.NO_SHOW:
                case ControlState.IDLE:
                case ControlState.SEARCH:
                    this.KeyPress_Idle_Search(sender, e);
                    break;
            }
        }

        void KeyDown_Idle(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Up:
                    if (this.textScrollingTimer.Enabled == true)
                        return;
                    this.textStartScrollingUp();
                    break;
                case Keys.Down:
                    if (this.textScrollingTimer.Enabled == true)
                        return;
                    this.textStartScrollingDown();
                    break;
                case Keys.Enter:
                    this.controlState = ControlState.NO_SHOW;
                    break;
            }

            this.draw();
        }

        void KeyUp_Idle(object sender, KeyEventArgs e)
        {
            base.OnKeyDown(e);

            switch (e.KeyCode)
            {
                case Keys.Up:
                case Keys.Down:
                    this.textStopScrolling();
                    break;
            }

            this.draw();
        }

        void KeyDown_Search(object sender, KeyEventArgs e)
        {
            e.Handled = true;
            switch (e.KeyCode)
            {
                case Keys.Enter:
                    this.textContent = this.db.searchList(this.textSearch);
                    this.textSearch = null;
                    this.controlState = ControlState.IDLE;
                    System.Threading.Thread.Sleep(50);
                    break;
                case Keys.Back:
                    this.textSearch = this.textSearch.Substring(0, this.textSearch.Length - 1);
                    this.textAutocomplete.Stop();
                    this.textAutocomplete.Start();
                    if (this.textSearch.Length == 0)
                        this.controlState = ControlState.IDLE;
                    break;
            }
            this.draw();
        }

        void KeyPress_Idle_Search(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar != 8 && e.KeyChar != 13)
            {
                this.textSearch += e.KeyChar;
                this.textAutocomplete.Stop();
                this.textAutocomplete.Start();
                this.controlState = ControlState.SEARCH;
            }
        }

        public void drawSearch()
        {
            this.device.BeginScene();
            this.textSearchFont.DrawText(null, this.textSearch, new Point(10, this.ClientSize.Height - 10 - 9), Color.Red);
            this.device.EndScene();
        }

        public void drawText()
        {
            device.BeginScene();
            this.textFont.DrawText(null, this.textContent, this.textRect, D3D.DrawTextFormat.WordBreak, Color.White);
            device.EndScene();
        }

        public void draw()
        {
            device.Clear(D3D.ClearFlags.Target, Color.Black, 1.0f, 0);

            switch (this.controlState)
            {
                case ControlState.IDLE:
                    this.drawText();
                    break;
                case ControlState.SEARCH:
                    this.drawText();
                    this.drawSearch();
                    break;
            }

            device.Present();
        }

        void DisplayResizeEnd(object sender, EventArgs e)
        {
            this.textInitializeRectangleSize();
            this.draw();
        }

        void DisplayPaint(object sender, PaintEventArgs e)
        {
            this.draw();
        }

        private void textInitialize()
        {
            this.textPosition = 0;
            this.textJump = 3;
            this.textContent = null;

            this.textAutocomplete = new Timer();
            this.textAutocomplete.Interval = 100;
            this.textAutocomplete.Tick += new System.EventHandler(textAutocomplete_Tick);

            this.textScrollingTimer = new Timer();
            this.textScrollingTimerInterval = 1;
            this.textScrollingTimer.Interval = this.textScrollingTimerInterval;
            this.textScrollingTimer.Tick += new System.EventHandler(textScrollingTimer_Tick);

            this.textInitializeRectangleSize();
            this.textInitializeFont();
        }

        void textAutocomplete_Tick(object sender, System.EventArgs e)
        {
            this.textContent = this.db.searchList(this.textSearch.Trim());
            this.textAutocomplete.Stop();
            this.draw();
        }

        private void textInitializeRectangleSize()
        {
            this.textRect = new Rectangle(10, 10 + this.textPosition, this.ClientSize.Width - 20, this.ClientSize.Height - 20 + this.textPosition);
        }

        private void textInitializeFont()
        {
            System.Drawing.Font systemfont1 = new System.Drawing.Font("Arial", 12f, FontStyle.Regular);
            System.Drawing.Font systemfont2 = new System.Drawing.Font("Arial", 9f, FontStyle.Regular);
            this.textFont = new D3D.Font(this.device, systemfont1);
            this.textSearchFont = new D3D.Font(this.device, systemfont2);
        }

        void textScrollingTimer_Tick(object sender, System.EventArgs e)
        {
            if (this.textScrollingUp == true)
                this.textPosition -= this.textJump;
            else
                this.textPosition += this.textJump;

            this.textInitializeRectangleSize();
            this.draw();
        }

        private void textStartScrollingUp()
        {
            this.textScrollingUp = true;
            this.textScrollingTimer.Start();
        }

        private void textStartScrollingDown()
        {
            this.textScrollingUp = false;
            this.textScrollingTimer.Start();
        }

        private void textStopScrolling()
        {
            this.textScrollingTimer.Stop();
        }
    }
}
4

1 に答える 1

2

私の推測では、イベント リスナーを 2 か所に追加します。おそらく、生成されたデザイナー コードと OnShown メソッドにあります (ところで、OnShown はイベント ハンドラーを追加する奇妙な場所です)。

于 2010-01-02T14:43:41.380 に答える