gpt4 book ai didi

c# - 使用 asp.net usercontrols 按属性值对列表进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:10 25 4
gpt4 key购买 nike

我正在用许多用户控件填充一个 div,现在它们是按照从数据库中读取的顺序添加的。 UserControls 标记如下所示:

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

然后我得到了这些绑定(bind)到标签的属性(有些被删除了,因为我不想让帖子变得困惑)。

        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();
}

现在,我想对这些控件执行的操作是按属性值对它们进行排序。 (首先加载最多的 View 等)。我目前正处于将它们添加到列表的阶段,现在我正在尝试使用 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:如何按属性值对用户控件进行排序。

最佳答案

你的列表是一个 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 的实例。但并非 A 的每个实例都是 B 的实例,因此您不能在 A 的实例上调用 B 属性。

打个比方……您有一个 Shape 对象列表,并用 Circle 对象填充它。这是可行的,因为 CircleShape。但是当您尝试访问该列表中某个元素的 Radius 属性时,您会收到错误消息。这是因为它是一个 Shape 列表,并不是每个形状都有一个 Radius。您需要使其成为 Circle 的列表或将该元素转换为 Circle 以便编译器知道有一个 Radius .

有关该主题的大量进一步阅读,请查看 PolymorphismLiskov Substitution Principle .

关于c# - 使用 asp.net usercontrols 按属性值对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com