c# - 如何通过在asp.net中选择下拉菜单选项来刷新结果顺序

标签 c# asp.net

我有一个 list :

List<CompanyModel1> companies1 = new List<CompanyModel1>();

其中 CompanyModel1 定义为:

public class CompanyModel1
    {
        public int compnSN1 { get; set; }
        public string compnStyle1 { get; set; }
        public string compnId1 { get; set; }
        public string compnKeySkills1 { get; set; }
        public string compnStandards1 { get; set; }
    }

现在,每次用户单击下拉列表中的选项时,我都需要对此列表进行不同的排序。

<asp:DropDownList ID="DropDownList1" runat="server" Width="200px"  
    autopostback="true" OnSelectedIndexChanged="DropDownList1sel">
    <asp:ListItem Text="abc" Value="0"></asp:ListItem>
    <asp:ListItem Text="Iso 9001" Value="1"></asp:ListItem>
    <asp:ListItem Text="Iso 2004" Value="2"></asp:ListItem>
    <asp:ListItem Text="Standard xyz" Value="3"></asp:ListItem>
</asp:DropDownList>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>

例如,如果单击“Iso 2004”,则会将所有“compnStandards1”=“Iso 2004”分组,并将其放在前面,其余的放在后面(重新排列)。

我知道我可以按以下方式对其进行分组:

companies1.GroupBy(o => o.compnStandards1).ToList();

但是如何对前面带有标准值“Iso 2004”的所有结果进行排序呢?我不能在这里使用正常排序,因为我不想使用字母排序。 此外,如果我需要从不同的 compnStandards1 值填充上面下拉菜单中的选项,是否可能以及如何实现?

最佳答案

您可以在 DropDownList1 的处理程序中轻松对列表进行动态排序

protected void DropDownList1sel(object sender, EventArgs e)
{
    // sort the companies according the selected standart
    var dinamicallySortedList = companies1.
        OrderByDescending(c => c.compnStandards1.Equals(DropDownList1.SelectedItem.Text));
    // for debug
    Label1.Text = string.Empty;
    // some work for the showing the companies
    foreach (var company in dinamicallySortedList)
    {
        Label1.Text += company.compnId1 + "<br />";
    }
}

在这里,选择新的一个标准后,列表将按照在公司中每个元素的 compnStandards1 属性中搜索到的标准名称的数字索引进行排序。

您可以使用 .Distinct() 方法获取所有标准,如下所示:

foreach (var standart in companies1.Where(c => !string.IsNullOrEmpty(c.compnStandards1)).Select(c => c.compnStandards1).Distinct())
{
    DropDownList1.Items.Add(new ListItem(standart));
}

我测试过的其余代码:

public partial class _Default : Page
{
    List<CompanyModel1> companies1 = new List<CompanyModel1>();

    protected void Page_Init(object sender, EventArgs e)
    {
        companies1.Add(new CompanyModel1
        {
            compnSN1 = 1,
            compnId1 = "Test 1",
            compnKeySkills1 = "Key 1",
            compnStyle1 = "Style 1",
            compnStandards1 = "abc"
        });
        companies1.Add(new CompanyModel1
        {
            compnSN1 = 2,
            compnId1 = "Test 2",
            compnKeySkills1 = "Key 2",
            compnStyle1 = "Style 2",
            compnStandards1 = "abc"
        });
        companies1.Add(new CompanyModel1
        {
            compnSN1 = 3,
            compnId1 = "Test 3",
            compnKeySkills1 = "Key 3",
            compnStyle1 = "Style 3",
            compnStandards1 = "Iso 2004"
        });
    }
    
    public class CompanyModel1
    {
        public int compnSN1 { get; set; }
        public string compnStyle1 { get; set; }
        public string compnId1 { get; set; }
        public string compnKeySkills1 { get; set; }
        public string compnStandards1 { get; set; }
    }
}

更新:

我的代码正在使用 UpdatePanel 中的标签 - 它用于部分页面更新:

    // sort the companies according the selected standart
    var dinamicallySortedList = companies1.
        OrderByDescending(c => c.compnStandards1.Equals(DropDownList1.SelectedItem.Text));
    // for debug
    Label1.Text = string.Empty;
    // some work for the showing the companies
    foreach (var company in dinamicallySortedList)
    {
        Label1.Text += company.compnId1 + "<br />";
    }

您可以使用this tutorial轻松地将ScriptManager添加到您的页面中。 ,例如。

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager ID="ScriptManager1" runat="server">
<asp:DropDownList ID="DropDownList1" runat="server" Width="200px"  
    autopostback="true" OnSelectedIndexChanged="DropDownList1sel">
</asp:DropDownList>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>

正如我所看到的,代码现在可以运行,所以你可以按照你的意愿使用它。然而,这并不是您获得问题的完整解决方案的地方。祝这个项目好运。


关于填充结果列表时出现的问题:

After getting companies1, I use your foreach loop to populate the option for dropdown menu.
Then bind companies1 to display the result (it is a search function). The result is display when I bind the data to the repeater at ascx file:

List<CompanyModel1> companies1sorted = companies1.OrderByDescending(o =>o.compnMastery1).ToList();
companyRepeater.DataSource = companies1sorted;
companyRepeater.DataBind();  

Then I want if user click options on dropdown menu, it will sort these results.

每次页面加载时,您都必须重新填充 .DataSource,因为它没有存储在 ViewState 中,并触发 DataBind 事件每次之后,都是这样的:

protected void DropDownList1sel(object sender, EventArgs e)
{
    // sort the companies according the selected standart
    var dinamicallySortedList = companies1.
        OrderByDescending(c => c.compnStandards1.Equals(DropDownList1.SelectedItem.Text));
    companyRepeater.DataSource = dinamicallySortedList;
    companyRepeater.DataBind();
}

确保您已在代码中附加到该事件:

<asp:DropDownList ID="DropDownList1" runat="server" Width="200px"  
    autopostback="true" OnSelectedIndexChanged="DropDownList1sel">
</asp:DropDownList>

对于多项选择,您可以使用级联方法:

companies1.OrderByDescending().ThenByDescending()

关于c# - 如何通过在asp.net中选择下拉菜单选项来刷新结果顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24626030/

相关文章:

c# - 使用 json.net 反序列化静态属性?

c# - 如何将文件上传到 IIS 中托管的 .NET 3.5 WCF 服务?

c# - linq to sql + 更新表

c# - 读取 WebException 的响应流

javascript - 如何在 asp.net 中使用 jquery 隐藏 <div> 标签?

c# - 来自 JSON 的 ASP.NET MVC 4 递归模型绑定(bind)

javascript - 取消输入时提交

c# - TFS 构建服务器在警告 "Cannot find the last label"后卡住

javascript - 如何包装/嵌套使用 'this' 的 javascript 调用?

c# - 如何处理 system.net.mail.smtpfailedrecipientsexception 失败的收件人