private void txtOctet1_TextChanged(object sender, EventArgs e)
{
double numCheck1;
if (txtOctet1.Text == "")
{
}
else
{
numCheck1 = Convert.ToDouble(txtOctet1.Text);
if (numCheck1 < 0 | numCheck1 > 255)
{
btnSubnetting.Enabled = false;
lblOctet1Error.Text = "Error";
lblOctet1Error.BackColor = Color.Red;
lblOctet1Error.ForeColor = Color.White;
}
else
{
btnSubnetting.Enabled = true;
lblOctet1Error.Text = "No Error";
lblOctet1Error.BackColor = Color.White;
lblOctet1Error.ForeColor = Color.Black;
}
}
}
我在C#中创建了一个十进制到二进制的转换器。这是一个由我制作的课程。用户在四个文本框中输入“IP地址”(每个Octet一个)。上面的代码确实有效,但我不想为其他第三个Octet输入文本框重复上面的代码。我将如何管理(如果可能的话)
答案 0 :(得分:3)
将代码解压缩为传递控件的辅助方法。
依次为每个控件调用此方法。
答案 1 :(得分:3)
不要向你展示解决方案,而是让我玩VS一点:
private void txtOctet1_TextChanged(object sender, EventArgs e)
{
double numCheck1;
TextBox txtToValidate = txtOctet1; // Variable 1
Label lblError = lblOctet1Error; // Variable 2
/* Select from here in the next step */
if (txtToValidate.Text == "") // Here, txtOctet1 replaced
{
}
else
{
numCheck1 = Convert.ToDouble(txtToValidate.Text); // Here, txtOctet1 replaced
if (numCheck1 < 0 | numCheck1 > 255)
{
btnSubnetting.Enabled = false;
lblError.Text = "Error"; // Here, lblOctet1Error replaced
lblError.BackColor = Color.Red; // Here, lblOctet1Error replaced
lblError.ForeColor = Color.White; // Here, lblOctet1Error replaced
}
else
{
btnSubnetting.Enabled = true;
lblError.Text = "No Error"; // Here, lblOctet1Error replaced
lblError.BackColor = Color.White; // Here, lblOctet1Error replaced
lblError.ForeColor = Color.Black; // Here, lblOctet1Error replaced
}
}
/* Select to here in the next step */
}
暂时没有进展
用鼠标或键盘,选择我放的两个评论占位符之间的所有代码。基本上,你应该完成最外面的if/else
语句。
右键单击选择代码,选择Refactor
,Extract to a method
。
为您的方法选择一个名称,例如ValidateOctet。
验证。您应该使用自定义方法提取逻辑:
private void txtOctet1_TextChanged(object sender, EventArgs e)
{
double numCheck1;
TextBox txtToValidate = txtOctet1; // Variable 1
Label lblError = lblOctet1Error; // Variable 2
ValidateOctet(txtToValidate, lblError);
}
private void ValidateOctet(TextBox txtToValidate, Label lblError)
{
if (txtToValidate.Text == "") // Here, txtOctet1 replaced
{
}
else
{
numCheck1 = Convert.ToDouble(txtToValidate.Text); // Here, txtOctet1 replaced
if (numCheck1 < 0 | numCheck1 > 255)
{
btnSubnetting.Enabled = false;
lblError.Text = "Error"; // Here, lblOctet1Error replaced
lblError.BackColor = Color.Red; // Here, lblOctet1Error replaced
lblError.ForeColor = Color.White; // Here, lblOctet1Error replaced
}
else
{
btnSubnetting.Enabled = true;
lblError.Text = "No Error"; // Here, lblOctet1Error replaced
lblError.BackColor = Color.White; // Here, lblOctet1Error replaced
lblError.ForeColor = Color.Black; // Here, lblOctet1Error replaced
}
}
}
仍无明显进展
我选择通过删除之前创建的变量来简化代码。我可以直接使用文本框和标签引用调用该方法。选择保留变量与否是代码样式的问题。
private void txtOctet1_TextChanged(object sender, EventArgs e)
{
double numCheck1;
ValidateOctet(txtOctet1, lblOctet1Error);
}
只需为所有文本框/标签调用ValidateOctet
:
private void txtOctet1_TextChanged(object sender, EventArgs e)
{
double numCheck1;
ValidateOctet(txtOctet1, lblOctet1Error);
ValidateOctet(txtOctet2, lblOctet2Error);
ValidateOctet(txtOctet3, lblOctet3Error);
ValidateOctet(txtOctet4, lblOctet4Error);
}
进展:你现在已经在一个地方定义了逻辑
System.Net.IPAdress
class。这提供了一组与IP地址一起使用的方法(特别是TryParse
method)。请注意,我的答案不是找到更好的解决方案,而是帮助您使用Visual Studio及其重构功能。在实际实现之前,从简单的事情开始,原型化或者稍微玩一下是很常见的。重构工具允许简单地重新设计代码的某些部分。
答案 2 :(得分:0)
编写方法/函数并在每个TextChange方法中调用它;您必须将TextField作为参数传递给设置颜色/错误。
答案 3 :(得分:0)
创建一个接收TextBox和Label的方法,并为每组文本框/标签调用该方法一次。
(以下示例)
答案 4 :(得分:0)
您可以将相同的TextChanged事件附加到所有文本框。生成事件的框将位于sender参数中,因此您可以在事件中获得此TextBox txtOctet = (TextBox)sender;
。
或者你可以只使用一个文本框,这就是我们的工作。这有两个好处。您还可以在那里键入IPv6地址,只需使用标准函数解析地址即可完成验证。我们验证这样的地址:
IPAddress address = null;
IPAddress.TryParse(txtIP.Text, out address);
if(address == null)
{
// Set error...
}