2014-03-05 34 views
2

我填充了許多用戶控件一個div,現在他們正在順序,他們正在從數據庫中讀取添加的排序與asp.net用戶控件列表。該用戶控件的標記看起來是這樣的:的屬性值

<div class="Content_Thumb"> 

    <div class="Video_pic"> 
     <a href="tutorialname.aspx"> 
     <asp:Label ID="TutInfo" CssClass="CoverLbl_top" runat="server" Text="Label"></asp:Label> 
     <asp:Label ID="TutInfo2" CssClass="CoverLbl_bottom" runat="server" Text="Description..."></asp:Label> 
     <asp:Image ID="ThumbPic" CssClass="Thumb_Pic" runat="server" ImageUrl="/Images/Video_Thumb.png" /> 
     </a> 
    </div> 

    <div class="Thumb_Info"> 
     <asp:Label ID="Views" CssClass="ViewsLbl" runat="server" Text="680"></asp:Label> 
     <asp:Label ID="Comments" CssClass="CommentsLbl" runat="server" Text="11"></asp:Label> 
     <asp:Label ID="Likes" CssClass="LikesLbl" Style="TEXT-ALIGN: right" runat="server" Text="133"></asp:Label> 
    </div> 

    <div class="Thumb_Border"> 
      <asp:Image ID="UserPic" CssClass="Thumb_UploaderPic" runat="server" ImageUrl="/Images/Profile_Placeholder.png" /> 
      <a href="google.com"> 
       <asp:Label ID="UserLbl" CssClass="Thumb_UploaderInfo" runat="server" Text="Label"></asp:Label> 
      </a> 
    </div> 

那麼我就被綁定到標籤(一些刪除,因爲我不想弄亂後)這些屬性。

 public string TutorialInfo 
    { 
     get; 
     set; 
    } 

    public int TutorialViews 
    { 
     get; 
     set; 
    } 

    public override void DataBind() 
    { 
     TutInfo.Text = TutorialInfo; 
     Views.Text = TutorialViews.ToString(); 
     Comments.Text = TutorialComments.ToString(); 
     Likes.Text = TutorialLikes.ToString(); 
     UserLbl.Text = TutorialUploader; 
     base.DataBind(); 
    } 

現在,我想對這些控件做的事情是按屬性值對它們進行排序。 (最高數量的視圖首先加載等)。我目前正處於將它們添加到列表中的階段,現在我正在嘗試使用LINQ的OrderBy對列表進行排序,就像我在這裏的帖子中看到的一樣。

List<UserControl> controls = new List<UserControl>(); 

     foreach (var Tutorial in dataconnection.Tutorial) 
     { 
      var control = LoadControl("~/WebUserControl1.ascx") as WebUserControl1; 

      control.TutorialInfo = Tutorial.Title; 
      control.TutorialComments = (int)Tutorial.Comments; 
      control.TutorialViews = (int)Tutorial.Views; 
      control.TutorialLikes = (int)Tutorial.Likes; 
      control.TutorialUploader = Tutorial.Uploader; 
      control.DataBind(); 
      //base.OnPreRender(e); 
      ThumbTest.Controls.Add(control); 
      controls.Add(control); 
      var testcount = controls.Count(); 
      control.Visible = false; 

     } 

     var SortedList = controls.OrderBy(o => o.TutorialViews).ToList(); 

但是即使它們是公共的,我仍然無法訪問屬性? 「o.TutorialViews」正在拋出一個錯誤。那麼我如何分類這些控制?

我是相當新的總體規劃,所以我道歉,如果這原來是一個愚蠢的錯誤。

TLDR:如何按屬性值排序Usercontrols。

回答

0

您的清單是UserControl對象的列表,它是由ASP.NET提供的通用用戶控制:

List<UserControl> controls = new List<UserControl>(); 

UserControl對象不具有的屬性稱爲TutorialViews,所以你不能訪問該類型的屬性。但是,您要添加自定義用戶控件到列表:

var control = LoadControl("~/WebUserControl1.ascx") as WebUserControl1; 

如果列表中的每一個項目將是WebUserControl1類型,那麼你可以聲明列表本身與該類型:

List<WebUserControl1> controls = new List<WebUserControl1>(); 

由於WebUserControl1確實定義該屬性,您將能夠訪問它。

另一種方法可能會投它,當你訪問它,就像這樣:

controls.OrderBy(o => ((WebUserControl1)o).TutorialViews) 

但是,這是一種凌亂的,不應該是必要的。首先使用正確的類型會更好。

從本質上講,這是C#(和許多其他語言)的靜態類型性質的症狀。 B類從A類繼承,所以B的每一個實例是A的一個實例,但不是每一個實例是B的一個實例,因此你不能調用A.

思考的一個實例B房產的一個類比...你有一個Shape對象的列表,並用Circle對象填充它。這有效,因爲Circle s是Shape s。但是,然後嘗試訪問該列表中某個元素的Radius屬性,並且出現錯誤。這是因爲它是一個Shape s的列表,並不是每個形狀都有一個Radius。您需要將其作爲Circle的列表,或者將該元素投射到Circle,以使編譯器知道有Radius

有關這方面的更多內容,請看PolymorphismLiskov Substitution Principle

+0

這工作神奇!大衛,你確實是人間的神。 :) 非常感謝! –