2

我希望有人能帮忙。我到处都检查过这个问题的答案,但找不到任何东西。我无法让我的第一个 if 语句“开火”。

在我的表单中,我有一个文本框供用户输入数量,当它是子类别名称中带有“箔”和“标准”或“印刷”和“迷你”的产品时,我试图将其验证为 150 . 如果它没有这 4 个单词中的任何一个,那么最小数量应默认为 250。这是我的“数量”文本框的代码:

<asp:TextBox ID="txtQuantity" runat="server" Text="Quantity" Width="300" />
<asp:RequiredFieldValidator ID="rfvQuantity" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Quantity Required" Display="None" ValidationGroup="Quote" />
<asp:CompareValidator ID="cmvQuantity" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Insufficient Quantity" Display="None" ValueToCompare="250" Operator="GreaterThanEqual" Type="Integer" ValidationGroup="Quote" />
<asp:CompareValidator ID="cmvQuantityText" runat="server" ControlToValidate="txtQuantity" ErrorMessage="Quantity Required" Display="None" Operator="DataTypeCheck" Type="Integer" ValidationGroup="Quote" />

这是背后的代码:

protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {

        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
    }
}

由于某种原因,它似乎只适用于最后一个条件,而不是第一个,即使我切换条件语句的位置,它仍然只适用于最后一个语句,而不是第一个。
所以我认为这是一个语义问题?任何帮助将不胜感激!!谢谢!

4

3 回答 3

1

我看到的问题是您ValueToCompare为相同的比较验证器控件设置了cmvQuantity两次,这是完全错误的方式,因为最后要执行的最后一个将是对属性值的最终更改,所以下面是应该在您的情况下工作的实现。

protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
       Product productInstance = e.Item.DataItem as Product; //safely type cast
       CompareValidator cmvQuantity = e.Item.FindControl("cmvQuantity") as CompareValidator; //safely type cast
       if (cmvQuantity != null && productInstance != null) //check if type cast suceeded and/or control was found.
       {
           if((productInstance.SubCategory.Category.Name.Contains("Foil") && productInstance.SubCategory.Name.Contains("Standard")) ||
              (productInstance.SubCategory.Category.Name.Contains("Printed") && productInstance.SubCategory.Name.Contains("Mini"))
           {
               cmvQuantity.ValueToCompare = "150";
           }
           else
           {
               cmvQuantity.ValueToCompare = "250";
           }
       }
    }
}

一些可能对您有帮助的要点

  • 尝试从页面中查找对象并将其放入变量中,而不是在每个新行中查找。例如,不要执行以下操作:

    public void Method()
    {
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = "Test value";
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ControlToValidate = "txtControlId";
    }
    

    将其实现为:

    public void Method()
    {
       CompareValidator cmvQuantity = e.Item.FindControl("cmvQuantity") as CompareValidator;
       if (cmvQuantity != null)
       {
           cmvQuantity.ValueToCompare = "Test value";
           cmvQuantity.ControlToValidate = "txtControlId";
       }
    }
    
  • 不要在 If-Else-if 中为相同的代码块添加每个新的。例如

    if (test == 1)
    {
       txtControl.Text = "150";
    }
    else if (test == 2)
    {
        txtControl.Text = "150";
    }
    else
    {
        txtControl.Text = "250";
    }
    

    将其实现为:

    if (test == 1 || test == 2)
    {
       txtControl.Text = "150";
    }
    else
    {
       txtControl.Text = "250";
    }
    
于 2012-08-31T08:13:59.460 回答
0

在这里你有或条件,所以我建议你区分条件,

    if (e.Item.ItemType == ListItemType.Item)
    {
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
    }
    else if (e.Item.ItemType == ListItemType.AlternatingItem)
    {
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250";
        ((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";
    }

并检查它是否工作。我没有测试过。

于 2012-08-31T06:48:04.050 回答
0

如果您考虑一下您的代码的作用,那应该是显而易见的。

首先,你这样做:

((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Foil") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Standard") ? "150" : "250"; 

然后,没有进一步的条件检查,你这样做:

((CompareValidator)e.Item.FindControl("cmvQuantity")).ValueToCompare = ((Product)e.Item.DataItem).SubCategory.Category.Name.Contains("Printed") && ((Product)e.Item.DataItem).SubCategory.Name.Contains("Mini") ? "150" : "250";  

因此,如果(Product)e.Item.DataItem包含FoilStandard,则第一行将 设置ValueToCompare为 150。

但是在下一行,这会立即改回 250 ,除非(Product)e.Item.DataItem还包含Printedand Mini

尝试将您的代码更改为:

protected void rptProduct_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var validator = e.Item.FindControl("cmvQuantity") as CompareValidator;
        var product = (Product)e.Item.DataItem;
        if (validator != null)
        {
            if (product.SubCategory.Category.Name.Contains("Foil") && product.SubCategory.Category.Name.Contains("Standard"))
            {
                validator.ValueToCompare = "150";
            }
            else if (product.SubCategory.Category.Name.Contains("Printed") && product.SubCategory.Category.Name.Contains("Mini"))
            {
                validator.ValueToCompare = "150";
            }
            else
            {
                validator.ValueToCompare = "250";
            }
        }
    }
}
于 2012-08-31T06:53:59.860 回答