none
我的在DetailsView中的RequiredFieldValidator控件的onload事件被执行了两次!!! RRS feed

  • 问题

  •  

     

    我的RequiredFieldValidator控件的onload事件被执行了两次!!!

     

    I have a WebForm. a DetailsView in this WebForm。

    我有一个DetailsView,里面用InsertItemTemplate方式控制用户输入。使用RequiredFieldValidator空间验证用户的输入。因为DetailsView的对应的表fields有很多,是针对不同情况的字段。我使用QueryString来判断不同的情况,将不需要的Filed隐藏掉。因为发现那些隐藏掉RequiredFieldValidator控件虽然在客户端不执行了,但是在服务器端的验证还是失败的。页面提交后,一直不能插入,我追踪DetailsView_ItemCommand事件发现Page. Validators中的那些被隐藏的验证空间的验证是失败的。后来查询MSDN帮着,应该是要把enabled属性设置为false。我就用下面的办法在page_load事件里配置了enabled属性。可是依旧失败!!

     

    protected void Page_Load(object sender, EventArgs e)
    {
      if(!this.IsPostBack)
      {
       buildRow();
      } 
    }
    
    void buildRow()
    { 
      int i = 0;
      foreach (DataControlField field in this.DetailsView.Fields)
      {   
        if (Request.QueryString["id"] == "1")
        {
          if (field.HeaderText == "feild1")
          {
            field.Visible = true;       
          }
          else if (field.HeaderText == "feild2")
          {
            field.Visible = true;
          }
          else if (field.HeaderText == "")//commandField
          {
            
            field.Visible = true;
          }
          else
          {
            foreach (Control control in this.DetailsView.Rows[i].Cells[1].Controls)
            {
              if (control.GetType().BaseType == typeof(BaseValidator))
              {
                ((BaseValidator)control).Enabled=false;
              }
              
            }
            field.Visible = false;
          }
        }
        i++;
      }  
    }
    


     

    我不知道为什么,我手动给需要隐藏的Validatorcontrol增加了load事件。代码如下:

     

     

    <asp:HiddenField ID="LSH" runat="server" />
    <asp:ObjectDataSource ID="ObjectDataSource" runat="server" InsertMethod="InsertBusinessInfo" SelectMethod="GetBunessInfo" TypeName="Wscgs.BusinessDB" OnInserted="ObjectDataSource_Inserted" OnInserting="ObjectDataSource_Inserting">
      <SelectParameters>
        <asp:ControlParameter ControlID="LSH" Name="lsh" PropertyName="Value" Type="Int32" />
      </SelectParameters>
      <InsertParameters>
        <asp:Parameter Direction="InputOutput" Name="LSH" Type="Int32" />
        <asp:Parameter Name="fild1" Type="String" />
        <asp:Parameter Name="fild2" Type="String" />
        <asp:Parameter Name="fild3" Type="String" />
        <asp:Parameter Name="fild4" Type="String" />
      </InsertParameters>
    </asp:ObjectDataSource>
    <asp:DetailsView ID="DetailsView" runat="server" AutoGenerateRows="False"
      BorderWidth="1px" CellPadding="5" DataSourceID="ObjectDataSource" DefaultMode="Insert"
      Width="600px" OnItemCommand="DetailsView_ItemCommand" OnLoad="DetailsView_Load" >
      <Fields>
        <asp:TemplateField HeaderText="LSH" SortExpression="LSH">
          <InsertItemTemplate>
            <asp:Label ID="LabelLSH" runat="server" Text="autofeed"></asp:Label>
          </InsertItemTemplate>
          <ItemTemplate>
            <asp:Label ID="LabelLSH" Font-Bold="True" ForeColor="Red" Font-Size="Larger" runat="server" Text='<%# Bind("LSH") %>'></asp:Label>
          </ItemTemplate>
          <ControlStyle Width="220px" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="fild1" SortExpression="fild1">
          <InsertItemTemplate>
            <asp:TextBox ID="TextBoxXM" runat="server" Text='<%# Bind("fild1") %>'></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxXM"
              Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
          </InsertItemTemplate>
          <ItemTemplate>
            <asp:Label ID="LabelXM" runat="server" Text='<%# Bind("fild1") %>'></asp:Label>
          </ItemTemplate>
          <ControlStyle Width="220px" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="fild2" SortExpression="fild2">
          <InsertItemTemplate>
            <asp:TextBox ID="TextBoxZSDZ" runat="server" Text='<%# Bind("fild2") %>'></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator2"
              runat="server" ControlToValidate="TextBoxZSDZ" Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
          </InsertItemTemplate>
          <ItemTemplate>
            <asp:Label ID="LabelZSDZ" runat="server" Text='<%# Bind("fild2") %>'></asp:Label>
          </ItemTemplate>
          <ControlStyle Width="400px" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="fild3" SortExpression="fild3">
          <InsertItemTemplate>
            <asp:TextBox ID="TextBoxYZBM" runat="server" Text='<%# Bind("fild3") %>'></asp:TextBox>
            <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="TextBoxYZBM" OnLoad="Validator_Load"
             Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
          </InsertItemTemplate>
          <ItemTemplate>
            <asp:Label ID="LabelYZBM" runat="server" Text='<%# Bind("fild3") %>'></asp:Label>
          </ItemTemplate>
          <ControlStyle Width="220px" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="fild4" SortExpression="fild4">
          <InsertItemTemplate>
            <asp:TextBox ID="TextBoxGDDH" runat="server" Text='<%# Bind("fild4") %>'></asp:TextBox>
          </InsertItemTemplate>
          <ItemTemplate>
            <asp:Label ID="LabelGDDH" runat="server" Text='<%# Bind("fild4") %>'></asp:Label>
          </ItemTemplate>
          <ControlStyle Width="220px" />
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
          <InsertItemTemplate>      
            <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Insert"
              Font-Bold="true" Height="35px" Text="insert" />
            <asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel"
              Height="35px" Text="Cancel" />       
          </InsertItemTemplate>
          <ItemTemplate>
          </ItemTemplate>
          <ControlStyle Font-Size="20px" />
          <ItemStyle BackColor="#D4D0C8" Height="60px" HorizontalAlign="Center" />
        </asp:TemplateField>
      </Fields>
    </asp:DetailsView>
    <script runat="Server">
    protected void Validator_Load(object sender, EventArgs e)//this Event execute twice!
    {
      RequiredFieldValidator Validator= (RequiredFieldValidator)sender;
      Console.Write(Validator.Enabled);
    }
    </script>
    


     

    我惊奇的发现load事件被执行了两次。

    第一次中可以捕获到validator.Enabled==false,证明我在Page_load事件里的操作是被执行了的。

    第二次中同样捕获validator,这时候validator.Enabled==true!!!我还尝试在Page_load事件中移除Page.Validators集合中我不想使用的验证控件。可是同样在第二次执行load事件后,Page.Validators集合回复成我没有移除之前的个数,而且集合里面所有的验证空间的Enable都是TRUE!!!我百思不得其解。

     

    in then secend time ,the Validator.Enabled==true!!!! I don't know why,Who excute Validator_Load angin,why the Enabled change to TRUE?
    ps:ALL MY RequiredFieldValidator's EnableViewState==true!

     


    2011年7月1日 8:08

全部回复

  •  

    我的RequiredFieldValidator控件的onload事件被执行了两次!!!

     

    I have a WebForm. a DetailsView in this WebForm。

    我有一个DetailsView,里面用InsertItemTemplate方式控制用户输入。使用RequiredFieldValidator空间验证用户的输入。因为DetailsView的对应的表fields有很多,是针对不同情况的字段。我使用QueryString来判断不同的情况,将不需要的Filed隐藏掉。因为发现那些隐藏掉RequiredFieldValidator控件虽然在客户端不执行了,但是在服务器端的验证还是失败的。页面提交后,一直不能插入,我追踪DetailsView_ItemCommand事件发现Page. Validators中的那些被隐藏的验证空间的验证是失败的。后来查询MSDN帮着,应该是要把enabled属性设置为false。我就用下面的办法在page_load事件里配置了enabled属性。可是依旧失败!!

    protected void Page_Load(object sender, EventArgs e)
    {
       if(!this.IsPostBack)
       {
         buildRow();
       } 
    }
    
    void buildRow()
    {  
        int i = 0;
        foreach (DataControlField field in this.DetailsView.Fields)
        {     
            if (Request.QueryString["id"] == "1")
            {
                if (field.HeaderText == "feild1")
                {
                    field.Visible = true;              
                }
                else if (field.HeaderText == "feild2")
                {
                    field.Visible = true;
                }
                else if (field.HeaderText == "")//commandField
                {
                    
                    field.Visible = true;
                }
                else
                {
                    foreach (Control control in this.DetailsView.Rows[i].Cells[1].Controls)
                    {
                        if (control.GetType().BaseType == typeof(BaseValidator))
                        {
                            ((BaseValidator)control).Enabled=false;
                        }
                        
                    }
                    field.Visible = false;
                }
            }
            i++;
        }    
    }
    


    我不知道为什么,我手动给需要隐藏的Validatorcontrol增加了load事件。代码如下:

    <asp:HiddenField ID="LSH" runat="server" />
    <asp:ObjectDataSource ID="ObjectDataSource" runat="server" InsertMethod="InsertBusinessInfo" SelectMethod="GetBunessInfo" TypeName="Wscgs.BusinessDB" OnInserted="ObjectDataSource_Inserted" OnInserting="ObjectDataSource_Inserting">
        <SelectParameters>
            <asp:ControlParameter ControlID="LSH" Name="lsh" PropertyName="Value" Type="Int32" />
        </SelectParameters>
        <InsertParameters>
            <asp:Parameter Direction="InputOutput" Name="LSH" Type="Int32" />
            <asp:Parameter Name="fild1" Type="String" />
            <asp:Parameter Name="fild2" Type="String" />
            <asp:Parameter Name="fild3" Type="String" />
            <asp:Parameter Name="fild4" Type="String" />
        </InsertParameters>
    </asp:ObjectDataSource>
    <asp:DetailsView ID="DetailsView" runat="server" AutoGenerateRows="False"
        BorderWidth="1px" CellPadding="5" DataSourceID="ObjectDataSource" DefaultMode="Insert"
        Width="600px" OnItemCommand="DetailsView_ItemCommand" OnLoad="DetailsView_Load" >
        <Fields>
            <asp:TemplateField HeaderText="LSH" SortExpression="LSH">
                <InsertItemTemplate>
                    <asp:Label ID="LabelLSH" runat="server" Text="autofeed"></asp:Label>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelLSH" Font-Bold="True" ForeColor="Red" Font-Size="Larger" runat="server" Text='<%# Bind("LSH") %>'></asp:Label>
                </ItemTemplate>
                <ControlStyle Width="220px" />
            </asp:TemplateField>
            <asp:TemplateField HeaderText="fild1" SortExpression="fild1">
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBoxXM" runat="server" Text='<%# Bind("fild1") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxXM"
                        Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelXM" runat="server" Text='<%# Bind("fild1") %>'></asp:Label>
                </ItemTemplate>
                <ControlStyle Width="220px" />
            </asp:TemplateField>
            <asp:TemplateField HeaderText="fild2" SortExpression="fild2">
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBoxZSDZ" runat="server" Text='<%# Bind("fild2") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator2"
                        runat="server" ControlToValidate="TextBoxZSDZ" Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelZSDZ" runat="server" Text='<%# Bind("fild2") %>'></asp:Label>
                </ItemTemplate>
                <ControlStyle Width="400px" />
            </asp:TemplateField>
            <asp:TemplateField HeaderText="fild3" SortExpression="fild3">
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBoxYZBM" runat="server" Text='<%# Bind("fild3") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="TextBoxYZBM" OnLoad="Validator_Load"
                     Display="Dynamic" ErrorMessage="*"></asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelYZBM" runat="server" Text='<%# Bind("fild3") %>'></asp:Label>
                </ItemTemplate>
                <ControlStyle Width="220px" />
            </asp:TemplateField>
            <asp:TemplateField HeaderText="fild4" SortExpression="fild4">
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBoxGDDH" runat="server" Text='<%# Bind("fild4") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="LabelGDDH" runat="server" Text='<%# Bind("fild4") %>'></asp:Label>
                </ItemTemplate>
                <ControlStyle Width="220px" />
            </asp:TemplateField>
            <asp:TemplateField ShowHeader="False">
                <InsertItemTemplate>            
                    <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Insert"
                        Font-Bold="true" Height="35px" Text="insert" />
                    <asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel"
                        Height="35px" Text="Cancel" />             
                </InsertItemTemplate>
                <ItemTemplate>
                </ItemTemplate>
                <ControlStyle Font-Size="20px" />
                <ItemStyle BackColor="#D4D0C8" Height="60px" HorizontalAlign="Center" />
            </asp:TemplateField>
        </Fields>
    </asp:DetailsView>
    <script  runat="Server">
    protected void Validator_Load(object sender, EventArgs e)//this Event execute twice!
    {
        RequiredFieldValidator Validator= (RequiredFieldValidator)sender;
        Console.Write(Validator.Enabled);
    }
    </script>
    


    我惊奇的发现load事件被执行了两次。

    第一次中可以捕获到validator.Enabled==false,证明我在Page_load事件里的操作是被执行了的。

    第二次中同样捕获validator,这时候validator.Enabled==true!!!我还尝试在Page_load事件中移除Page.Validators集合中我不想使用的验证控件。可是同样在第二次执行load事件后,Page.Validators集合回复成我没有移除之前的个数,而且集合里面所有的验证空间的Enable都是TRUE!!!我百思不得其解。

     

    in then secend time ,the Validator.Enabled==true!!!! I don't know why,Who excute Validator_Load angin,why the Enabled change to TRUE?
    ps:ALL MY RequiredFieldValidator's EnableViewState==true!

    2011年6月30日 7:21
  • 谁能帮帮我呀。
    2011年7月1日 7:41
  • no one?
    2011年7月3日 6:49
  • no one?
    2011年7月3日 6:50
  • 你发错版块了 这 和LINQ有什么关系?


    Best Regards,
    If a post answers your question, please click "Mark As Answer" on that post and "Mark as Helpful".
    2011年7月3日 11:25
  • 不知道该发到哪个板块。在本论坛的ASP.NET 与 AJAX板块发了也没人回应。这个版本置顶的教材贴里有关于数据控件帖子。

    http://forums.asp.netWeb Forms Data Controls板块发帖照样没人回应。

    我都快绝望了。

    2011年7月4日 2:48
  • 为啥没人能够帮我呢?版主呢?
    2011年7月4日 2:49
  • 你好,对于这个问题在http://forums.asp.netWeb Forms Data Controls板块里发帖是正确的,请耐心等待,会有人答复你的。这里确实与此论坛没什么太大关系,我会将你的帖子移到一般性问题讨论区,看看在那边能不能专家回复。

    谢谢,


    Jackie Sun [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年7月4日 14:35
  • 继续求教
    2011年7月5日 3:15
  • 在发此发帖之前已经在Web Forms Data Controls发帖问了。可惜一直没人回复
    2011年7月9日 2:21
  • 不过依旧谢谢你
    2011年7月9日 2:21