<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      解決DropDownList常見問題三則

      1,給SelectedValue賦值時,如果Items中沒有該項(xiàng),則報XXX異常;
      2,在綁定時,如果數(shù)據(jù)源返回null,它將不做任何動作,而我們一般習(xí)慣清空;
      3,在綁定到數(shù)據(jù)源,而數(shù)據(jù)源參數(shù)依賴于別的控件時,會觸發(fā)兩次數(shù)據(jù)源綁定。

       

      我的解決方法就是重載DropDownList(比較菜),下面詳細(xì)說說這三個小問題:

      1,比如某個商品屬于某個分類,然后分類被刪除了,而商品表中記錄的還是原來類別的ID,在綁定DropDownList時,就會報那個常見的異常。這個比較頭疼,因?yàn)闆]有太好的辦法使用代碼控制。我們可以通過重載SelectedValue屬性和PerformDataBinding方法來解決:

      代碼
              private const String ExceptionString = "(異常)";

              
      private String cachedSelectedValue;
              
      /// <summary>
              
      /// 已重載。加上未添加到列表的項(xiàng)。
              
      /// </summary>
              public override string SelectedValue
              {
                  
      get
                  {
                      
      return base.SelectedValue;
                  }
                  
      set
                  {
                      
      if (Items.FindByValue(value) == null)
                      {
                          
      // 列表項(xiàng)中并沒有該選項(xiàng),自動加入,并打上異常標(biāo)識
                          Items.Add(new ListItem(value + ExceptionString, value));
                          cachedSelectedValue 
      = value;
                      }
                      
      base.SelectedValue = value;
                  }
              }

              
      /// <summary>
              
      /// 綁定數(shù)據(jù)
              
      /// </summary>
              
      /// <param name="dataSource"></param>
              protected override void PerformDataBinding(IEnumerable dataSource)
              {
                  
      base.PerformDataBinding(dataSource);

                  
      if (cachedSelectedValue != null)
                  {
                      ClearSelection();

                      
      // 重新設(shè)置選中項(xiàng)
                      ListItem item = Items.FindByValue(cachedSelectedValue);
                      
      if (item == null)
                      {
                          item 
      = new ListItem(cachedSelectedValue + ExceptionString, cachedSelectedValue);
                          Items.Add(item);
                      }
                      item.Selected 
      = true;
                  }
              }

      2,在省市兩級下拉聯(lián)動的時候,如果第一級選擇直轄市,沒有下一級城市,第二個下拉就應(yīng)該顯示沒有子城市或者就顯示直轄市,或者干脆清空。而默認(rèn)情況下,DropDownList是不做任何事情的。這個可以重載PerformSelect實(shí)現(xiàn)(含第三點(diǎn)的實(shí)現(xiàn)代碼):

      代碼
              private Boolean selecting = false;
              
      /// <summary>
              
      /// 已重載。避免綁定時重入該方法
              
      /// </summary>
              protected override void PerformSelect()
              {
                  
      if (selecting) return;

                  selecting 
      = true;
                  
      if (!this.AppendDataBoundItems)
                  {
                      
      // DropDownList在綁定時,如果數(shù)據(jù)源返回null,它將不做任何動作,而我們一般習(xí)慣清空
                      this.Items.Clear();
                  }
                  
      base.PerformSelect();
                  selecting 
      = false;
              }

       

      3, 仍然是省市兩級下拉聯(lián)動的例子,這兩個DropDownList分別綁定兩個ObjectDataSource,對應(yīng)實(shí)體類的Area.FindAllByParentID(Int32 parentID)。第一個下來可以設(shè)定參數(shù)為固定值0,表示頂級地區(qū)

      <asp:Parameter DefaultValue="0" Name="parentID" Type="Int32" />

      ;第二個下拉可以使用ControlParameter,依賴于第一個下拉的選擇

      <asp:ControlParameter ControlID="DropDownList1" Name="parentID" PropertyName="SelectedValue" Type="Int32" />

      這個時候,如果在FindAllByParentID下斷點(diǎn),會發(fā)現(xiàn)第二個下拉觸發(fā)了兩次綁定

      經(jīng)過一番探索發(fā)現(xiàn):首先是第二個DropDownList的DataBind,觸發(fā)了ObjectDataSource的Select,而在準(zhǔn)備Select的參數(shù)的時候,需要調(diào)用參數(shù)的UpdateValue去取依賴控件的值,正是這個UpdateValue,觸發(fā)了DataSourceChanged(實(shí)際比較復(fù)雜,這里為了易懂,從簡),然后再次Select……

      看看基類 DataBoundControlPerformSelect方法

      代碼
      protected override void PerformSelect()
      {
          
      if (this.DataSourceID.Length == 0)
          {
              
      this.OnDataBinding(EventArgs.Empty);
          }
          DataSourceView data 
      = this.GetData();
          
      this._arguments = this.CreateDataSourceSelectArguments();
          
      this._ignoreDataSourceViewChanged = true;
          
      base.RequiresDataBinding = false;
          
      this.MarkAsDataBound();
          data.Select(
      this._arguments, new DataSourceViewSelectCallback(this.OnDataSourceViewSelectCallback));
      }

      很明顯,_ignoreDataSourceViewChanged字段就是專門解決這個問題的。也就是說,控件團(tuán)隊已經(jīng)意識到會存在這種問題,所以在這里留了一手。但是為什么這一手沒有生效呢?
      我們來看看DropDownList的父類 ListControl,杯具,它重載了PerformSelect

      protected override void PerformSelect()
      {
          
      this.OnDataBinding(EventArgs.Empty);
          
      base.RequiresDataBinding = false;
          
      base.MarkAsDataBound();
          
      this.OnDataBound(EventArgs.Empty);
      }

      并且沒有調(diào)用父類的方法……這也說明了,ListControl之下的幾個控件BulletedListCheckBoxListDropDownListListBoxRadioButtonList,全部都存在同樣的問題,當(dāng)然,解決方法也是一樣的。

       

      兩年多沒寫博客了,最近對技術(shù),有點(diǎn)傷感!

      posted @ 2010-05-04 23:18  大石頭  閱讀(3186)  評論(7)    收藏  舉報
      主站蜘蛛池模板: 正在播放国产真实哭都没用| 国产亚洲精品成人aa片新蒲金| 麻豆国产传媒精品视频| 日本高清在线播放一区二区三区| 欧洲美熟女乱又伦AV影片| 中文字幕国产精品日韩| 中文国产不卡一区二区| 人人妻人人澡人人爽欧美一区双| 最近中文字幕国产精品| 午夜福利国产盗摄久久性| 国产成人无码午夜视频在线播放 | 性无码一区二区三区在线观看| 国产女人18毛片水真多1| 亚洲午夜福利网在线观看| 久久精品夜夜夜夜夜久久| 武夷山市| 国产精品伦人视频免费看| 三上悠亚日韩精品二区| 国内精品一区二区不卡| 欧美xxxxhd高清| 精品久久久久久无码免费| 无码国内精品久久人妻蜜桃| 中文字幕无码视频手机免费看| 国产精品免费观在线| 人人澡人摸人人添| 日韩亚洲精品国产第二页| 天美传媒xxxxhd videos3| 欧美视频精品免费覌看| 日韩一区二区三区精彩视频| 亚洲旡码欧美大片| 国产精品日韩av在线播放| 久久亚洲国产精品五月天| 综合图区亚洲欧美另类图片| 日本亚洲一区二区精品| 亚洲aⅴ无码专区在线观看q| 日韩一区二区三区三级| 熟女人妻视频| 自拍偷在线精品自拍偷免费| 久久久久成人片免费观看蜜芽| 激情97综合亚洲色婷婷五| 美女黄18以下禁止观看|