0

在我的 C# windows 窗体上,我有 3 个名为 textBuyPrice、textSell 和 textMargin 的文本框。用户可以输入买入价,如果他们输入卖出价,那么代码将为他们计算保证金。如果用户输入保证金,则代码将输入卖出价格。请参阅构成边际计算的这 2 位代码。

此代码捕获文本框中光标的输入并将当前值设置为变量。

private void textMargin_Enter(object sender, EventArgs e)
        {
        OriginalMarginValue = this.textMargin.Text;
        }

此代码捕获文本框中的离开事件并进行任何更改,运行一些计算并更新任何相关字段。

private void textMargin_Leave(object sender, EventArgs e)
        {
        if (this.textMargin.Text != OriginalMarginValue)
            {
            Parts part = new Parts();
            decimal dcmBuy = part.RemoveDollarSign(this.textBuyPrice.Text);
            decimal dcmMargin = part.RemovePercentSign(this.textMargin.Text);
            decimal dcmSell = part.GetSellPrice(dcmBuy, dcmMargin / 100);
            string strSell = dcmSell.ToString("C");
            this.textSellPrice.Text = strSell; 
            }

        }

正在发生的事情似乎是 Enter 和 Leave 事件之间的循环。当我尝试跳出文本框时,离开事件触发后。Enter 事件再次触发,它不会让我退出。

到底是怎么回事?我应该强制选项卡将焦点设置在另一个字段上吗?

上面的代码与 textSellPrice 代码相同,我在该文本框中没有同样的问题。

谢谢

编辑 这是调用堆栈,因为代码在尝试离开文本框后第二次进入 Enter 事件:

AutoShop.exe!AutoShop.formPartDetail.textMargin_Enter(object sender = {Text = "57.14 %"}, System.EventArgs e = {System.EventArgs}) 第 168 行 C# System.Windows.Forms.dll!System.Windows.Forms。 Control.OnEnter(System.EventArgs e) + 0x88 字节
System.Windows.Forms.dll!System.Windows.Forms.Control.NotifyEnter() + 0x1f 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl。 UpdateFocusedControl() + 0x195 字节 System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.AssignActiveControlInternal(System.Windows.Forms.Control 值 = {Text = "57.14 %"}) + 0x60 字节
System.Windows.Forms .dll!System.Windows.Forms.ContainerControl.ActivateControlInternal(System.Windows.Forms.Control control, bool originator = false) + 0x48 bytes
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.SetActiveControlInternal(System.Windows.Forms.Control value = {Text = "57.14 %"}) + 0x73 bytes
System.Windows.Forms.dll!System.Windows .Forms.ContainerControl.ValidateThroughAncestor(System.Windows.Forms.Control originalControl, bool preventFocusChangeOnError) + 0x212 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.EnterValidation(System.Windows.Forms.Control enterControl) + 0x7c 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.UpdateFocusedControl() + 0x8a 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.AssignActiveControlInternal(System.Windows.Forms.Control 值= {文本 = ""}) + 0x60 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ActivateControlInternal(System.Windows.Forms.Control control, bool originator = false) + 0x48 bytes
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl .SetActiveControlInternal(System.Windows.Forms.Control value = {Text = ""}) + 0x73 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.SetActiveControl(System.Windows.Forms.Control ctl) + 0x33 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ActiveControl.set(System.Windows.Forms.Control 值) + 0x5 字节
System.Windows.Forms.dll!System.Windows.Forms.Control。选择(布尔定向,布尔转发)+ 0x1b 字节
System.Windows.Forms.dll!System.Windows.Forms.Control.SelectNextControl(System.Windows.Forms.Control ctl, bool forward, bool tabStopOnly, bool nested, bool wrap) + 0x7e 字节
System.Windows.Forms.dll! System.Windows.Forms.Form.ProcessTabKey(bool forward = true) + 0x24 字节
System.Windows.Forms.dll!System.Windows.Forms.ContainerControl.ProcessDialogKey(System.Windows.Forms.Keys keyData = LButton | Back) + 0x71 字节

4

1 回答 1

0

尝试对文本框使用验证事件。您还将获得取消验证的选项。

例如

   private void textBox2_Validating(object sender, CancelEventArgs e)
        {
            if (DoSomething(textBox2))
            {
                textBox3.Text = textBox2.Text;
            }
            else
            {
                e.Cancel = true; //cancel the validation.
            }

        }
于 2014-06-25T15:36:09.823 回答