2

誰かが助けてくれることを願っています。私はどこでもこれに対する答えをチェックしましたが、何も見つかりません。「発砲」する最初のifステートメントを取得できません。

私のフォームには、ユーザーが数量を入力するためのテキストボックスがあり、サブカテゴリ名に「Foil」と「Standard」または「Printed」と「Mini」が含まれる製品の場合、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、同じCompare ValidatorコントロールcmvQuantityに2回設定したことです。これは、完全に間違った方法です。最後に実行するのはプロパティの値の最終的な変更であるため、以下はあなたの場合に機能する実装です。

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";  

したがって、がFoilStandard(Product)e.Item.DataItemを含む場合、最初の行はを150に設定します。ValueToCompare

ただし、次の行では、とが含まれていない限り、これはすぐに250に戻されます。(Product)e.Item.DataItemPrintedMini

コードを次のように変更してみてください。

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 に答える