WPF应用程序|文本框在传真号码

时间:2015-08-06 05:31:31

标签: c# wpf

我有这个应用程序由该公司的前任开发人员开发。

现在我正在尝试做一些小修补。

这是一个TextBox在开始时不接受“0”。

我的意思是传真号码可以是0912258685,但问题是文本框在最开始时获得“912258685”而不是“0”。

下面是该文本框的代码。

            <TextBox x:Name="tbFax" Height="25" TextWrapping="Wrap" Margin="0,0,87,0"
                     Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=FaxNo,
                            ValidatesOnDataErrors=True, NotifyOnValidationError=True}" TextChanged="tbFax_TextChanged"/>

下面是一些CS代码。因为这个TextBox是可选的。所以使用下面的代码。

          if(!(string.IsNullOrEmpty(tbFax.Text)))
            {
                try
                {
                    //fax = int.Parse(tbFax.Text.Trim());
                    fax = Int64.Parse(tbFax.Text);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
              }

其余部分代码如下。

try
                    {
                        if (!(CheckAlreadyExist(tbName.Text.Trim().ToString())))
                        {
                            AgentAccount dtAgent = new AgentAccount();
                            dtAgent.Name = tbName.Text;
                            dtAgent.ContactNo = Int64.Parse(tbContactNo.Text);
                            dtAgent.Address = tbAddress.Text;
                            dtAgent.City = cmbCity.Text;
                            dtAgent.Country = cmbCountry.Text;
                            dtAgent.Balance = balance;
                            dtAgent.AccStatus = "Active";
                            dtAgent.CreationDate = DateTime.Now;
                            dtAgent.Fax  = fax;
                            dtAgent.email = tbEmail.Text;
                            dtAgent.GbBranchId = GlobalClass.GbBranchID;

                            dc.AgentAccounts.InsertOnSubmit(dtAgent);
                            dc.SubmitChanges();
                            newAgentId = dtAgent.AgentID;
                            dc.SubmitChanges();

                            string messageBoxText = "Account Created Successfully\n Your Account No = '" + newAgentId +
                                                            "'\nDo You Want to take Receipt! ";
                            string caption = "Agent";
                            MessageBoxButton button = MessageBoxButton.YesNo;
                            MessageBoxImage icon = MessageBoxImage.Warning;

                            string result = MessageBox.Show(messageBoxText, caption, button, icon).ToString();
                            if (result == "Yes")
                            {
                                GetPrint(newAgentId);
                            }
                            else
                            {

                            }

                            tbName.Text = "";
                            tbContactNo.Text = "";
                            tbAddress.Text = "";
                            tbFax.Text = "";
                            tbEmail.Text = "";
                            cmbCity.SelectedIndex = -1;
                            cmbCountry.SelectedIndex = -1;
                        }
                        else
                        {
                            string msgtext = "Agent with same name already exist. You can't create same agent twice. Try with Different name!";
                            string caption = "Error";
                            MessageBoxButton button = MessageBoxButton.OK;
                            MessageBoxImage image = MessageBoxImage.Error;
                            MessageBox.Show(msgtext, caption, button, image).ToString();
                        }

                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);

                    }

我是否需要更改上面的代码,或者我还需要查看其他内容。??

信息:

我无法在表单中输入0。我的意思是即使我试着继续按0,它只是没有出现在乞讨像我的零按钮被禁用或什么。 所以我认为这不是保存按钮的问题,而是实际形式。我不确定,因为我不是真正的.NET开发经验。

= - = - = - = - = - = - = -

更新

我认为这个事件处理程序是负责任的,但也不确定ContactNo工作正常..

private void tbFax_TextChanged(object sender, TextChangedEventArgs e)
{
    ValidateInputIntegerTextBox(sender);
}

private void tbContactNo_TextChanged(object sender, TextChangedEventArgs e)
{

    ValidateInputIntegerTextBox(sender);
}
{
    TextBox textBox = sender as TextBox;
    Int32 selectionStart = textBox.SelectionStart;
    Int32 selectionLength = textBox.SelectionLength;
    String newText = String.Empty;
    int count = 0;
    foreach (Char c in textBox.Text.ToCharArray())
    {
        if (Char.IsDigit(c) || Char.IsControl(c) || (c == '0' && count == 0))
        {
            newText += c;
            if (c == '0')
                count += 1;

        }
    }
    textBox.Text = newText;
    textBox.SelectionStart = selectionStart <= textBox.Text.Length ? selectionStart : textBox.Text.Length;
}

完整代码在PasteBin中可用..

http://pastebin.com/Zr1ZckJr

完整的CS文件。

2 个答案:

答案 0 :(得分:1)

您应将传真/电话号码存储为文本。但是如果你坚持将它保留为数字并且在解析指令中跳过的前零点有问题;您可以保留传真号码字符串的长度,并在需要时,在整数的其余部分之前添加零:

var faxNumber = Int64.Parse(tbFax.Text);
var faxNumberLenght = tbFax.Text.Length;

当然是零位数,计算方式为:

var zeroCounts = faxNumberLenght - (faxNumber.ToString().Length);

答案 1 :(得分:1)

您在应用程序中存在多个问题和潜在的设计缺陷。

首先,您需要将电话/传真号码视为string数据而不是数字。想一想 - 电话号码可以有括号(例如(03)95551234),它们可以有空格(例如555 1234),它们可以有短划线(例如555-1234)等等。

第二,既然您将电话/传真号码视为字符串,则无需尝试将其转换为数字。

执行此操作:Int64.Parse(tbContactNo.Text);会抛出异常,例如,tbContactNo中有空格,圆括号或短划线。

第三次,您需要更新数据库表,以便您在其中存储这些数字的字段是文本字段,而不是数字字段。例如,使用NVARCHAR(20)代替INT

此数据类型更改的副作用是,dtAgent.Fax等字段需要从long更改为string。这将解决您的“Cannot implicitly convert type string to long”错误。

最后,根据您的应用程序的要求,电话/传真号码TextBox控件上的事件处理程序可以被删除,也可以更新以更好地处理输入

如果您想强制使用电话/传真号码的特定格式,您最好使用屏蔽输入,例如Extended WPF Toolkit提供的