<EditItemTemplate>
          <asp:UpdatePanel id="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <contenttemplate>
              <asp:DropDownList id="ddlProvince" runat="server" DataSourceID="ObjectDataSource4" __designer:wfdid="w61" OnDataBound="ddlProvince_DataBound" DataTextField="name" DataValueField="code" AutoPostBack="True"></asp:DropDownList>
              <asp:ObjectDataSource id="ObjectDataSource4" runat="server" TypeName="Biz.Bll.Info.area" SelectMethod="GetListForLevel">
                <SelectParameters>
                  <asp:Parameter DefaultValue="1" Name="Levels" Type="int32" />
                  <asp:Parameter DefaultValue="AreaTitle_Lv1" Name="MessageID" Type="String" />
                </SelectParameters>          
              </asp:ObjectDataSource>               
              <asp:DropDownList id="ddlCity" runat="server" DataSourceID="ObjectDataSource5" __designer:wfdid="w62" OnDataBound="ddlCity_DataBound" DataTextField="name" DataValueField="code"></asp:DropDownList> 
              <asp:ObjectDataSource id="ObjectDataSource5" runat="server" TypeName="Biz.BLL.Info.area" SelectMethod="GetListForUpcode" __designer:wfdid="w64">
                <SelectParameters>
                  <asp:ControlParameter ControlID="ddlProvince" PropertyName="SelectedValue" DefaultValue="-2" Name="UpCode" Type="Int32"></asp:ControlParameter>
                  <asp:Parameter DefaultValue="AreaTitle_Lv2" Name="MessageID" Type="String"></asp:Parameter>
                </SelectParameters>
              </asp:ObjectDataSource> 
            </contenttemplate>
          </asp:UpdatePanel>
        </EditItemTemplate>在保存的时候,发现只能取到ddlProvince的值,而ddlCity的值取到的确是默认值。
继续刷新下才能取到ddlCity的正确的值。
问题:为什么不能在保存的时候就正确的取到ddlProvince和ddlCity的值?而刷新下却又可以呢?

解决方案 »

  1.   

    两级都可以选的,而且显示的还是正确的。可是在保存的时候就是取不到ddlCity.SelectedValue就是错误的。
    取到的只是他的DefaultValue.
      

  2.   

    <asp:UpdatePanel id="UpdatePanel2" runat="server" UpdateMode="Conditional">
    ==
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="False"  UpdateMode="Conditional">
      

  3.   

    ChildrenAsTriggers="False"加上这个以后ddlCity(城市)根本就不会随着ddlProvince(省)的改变而变化了!
      

  4.   

    你要在你的后台代码中用Update2.Update()手动更新
      

  5.   

    上面的代码是包含在DetailsView中的。
    在我点击保存的时候,它只保存了ddlProvince的值和ddlCity的默认值,可是我继续刷新下就它就会把ddlProvince的值和ddlCity的值都保存起来。为什么会出现这种情况呢?
      

  6.   

      <asp:ControlParameter ControlID="ddlProvince" PropertyName="SelectedValue" DefaultValue="-2" Name="UpCode" Type="Int32"></asp:ControlParameter>
    我的这个参数设置就是根据选择的省来刷新县市的。
    这个是没有问题的。
      

  7.   


    如何保存的?贴几行代码。你是在RowUpdating事件中捕获结果吗?
      

  8.   

    DetailsView的数据源是ObjectDataSource1,
    我是在方法中保存的。void ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)
    {
    ...
        a.area= "#"+ddlProvince.SelectedItem.Value + "#,#" + ddlCity.SelectedItem.Value + "#";
    ...
    }
      

  9.   

    我不是说的DataSource的Updating事件。我从来没有这样在类似ObjectDataSource1的事件中去直接访问模板内的对象,能直接访问ddlProvince和ddlCity对象吗?我好像没有过这种概念。既然你使用DetailsView,那么就是在ItemUpdating中去捕获值,通过FindControl来找到内部的这两个下拉选单控件。
      

  10.   

    直接是不能的,我在其他的地方定义过。protected void ddlProvince_DataBound(object sender, EventArgs e)
      {
        Biz.Model.Ex.Users obj = (Biz.Model.Ex.Users)ViewState["obj"];
        Biz.BLL.Info.area area = new Biz.BLL.Info.area();
        DropDownList ddlProvince = (DropDownList)sender;
        int areaUpcode = area.GetUpCode(obj.areacode);    try
        {
          ddlProvince.Items.FindByValue(areaUpcode.ToString()).Selected = true;
        }
        catch
        { }
      }  protected void ddlCity_DataBound(object sender, EventArgs e)
      {
        Biz.Model.Ex.Users obj = (Biz.Model.Ex.Users)ViewState["obj"];
        DropDownList ddlCity = (DropDownList)sender;    try
        {
          ddlCity.Items.FindByValue(obj.areacode.ToString()).Selected = true;
        }
        catch
        { }
      }
      

  11.   

    直接可以使用?那两个控件在模板中,在页面上是不可能直接访问的。如果可以访问,你大概在页面其它地方定义过重名的控件。你在仔细看看..........哦,当然如果你的数据源有updatemethod,也可以在updating中给a.area赋值。不过,不妨把给a.area赋值的语句放在一个BLL方法中,并且在ObjectDataSource1的updateMethod中声明;将两个DropdownList的SelectedValue使用 Bind 绑定到字段值。可以尽量少写View方面的代码,实际上自己写的代码不访问控件,仅仅处理BLL中的数据。有时候自己写的涉及View的代码就会多余地重新强迫绑定数据源,增加调试难度。
      

  12.   

    另外呢,如果你发现这个需要花很长时间,并且你不排除asp.net ajax Toolkit,可以考虑使用 CascadingDropDown 控件,也相当简单好用(不过如果你从来没有用过toolkit,这可能也需要2天时间)。
      

  13.   

    知道错误的原因了!
    汗……
    原来是DetailsView里的ViewState=False这里设置错误。