web-dev-qa-db-ja.com

DropDownListを並べ替えますか? -C#、ASP.NET

C#/ ASP.NETでDropDownListを並べ替える最適なルート(速度や効率ではなく、単純さを重視)に興味があります-いくつかの推奨事項を調べましたが、うまくクリックしていません。

編集:皆さん、私はデータがDropDownListに入る方法を制御できません。SQLを変更することはできません。

33
scrot

データを含むDataTableを取得する場合、これからDataViewを作成し、ドロップダウンリストをそれにバインドできます。あなたのコードは次のようになります...

DataView dvOptions = new DataView(DataTableWithOptions);
dvOptions.Sort = "Description";

ddlOptions.DataSource = dvOptions;
ddlOptions.DataTextField = "Description";
ddlOptions.DataValueField = "Id";
ddlOptions.DataBind();

テキストフィールドと値フィールドのオプションは、受信しているデータテーブルの適切な列にマップされます。

23
Dillie-O

.NET 3.5のC#ソリューション(System.LinqおよびSystem.Web.UIが必要):

    public static void ReorderAlphabetized(this DropDownList ddl)
    {
        List<ListItem> listCopy = new List<ListItem>();
        foreach (ListItem item in ddl.Items)
            listCopy.Add(item);
        ddl.Items.Clear();
        foreach (ListItem item in listCopy.OrderBy(item => item.Text))
            ddl.Items.Add(item);
    }

ドロップダウンリストをバインドした後に呼び出します。 OnPreRender:

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ddlMyDropDown.ReorderAlphabetized();
    }

ユーティリティライブラリに貼り付けて、簡単に再利用できるようにします。

21
James McCormack

.Net Frameworkの最新バージョンを実行していると仮定すると、これは機能します。

List<string> items = GetItemsFromSomewhere();
items.Sort((x, y) => string.Compare(x, y));
DropDownListId.DataSource = items;
DropDownListId.DataBind();
16
SaaS Developer

DropDownListは、IEnumerableをデータソースとして受け取ります。

LINQを使用して並べ替えるだけです。

11
Jim

通常、データベーステーブルの値を使用してDropDownListを読み込むため、最も簡単な方法は、SELECTステートメントのORDER BY句を使用して必要に応じて結果を並べ替え、結果を繰り返し処理してDropDownListにダンプすることです。

5
MusiGenesis

CodeProjectのこの記事 を見てください。これは、ドロップダウンリストのコンテンツを再配置します。データバインディングを行う場合、データがリストにバインドされた後にソーターを実行する必要があります。

2
Samuel Kim

別のオプションは、ListItemを配列に入れて並べ替えることです。

        int i = 0;
        string[] array = new string[items.Count];

        foreach (ListItem li in dropdownlist.items)
        {
            array[i] = li.ToString();
            i++;

        }

        Array.Sort(array);

        dropdownlist.DataSource = array;
        dropdownlist.DataBind();
2
Tony Anderson

データをDropDownListにデータバインドする前にデータを並べ替えることをお勧めしますが、できない場合は、DropDownListのアイテムを並べ替えます。

まず、比較クラスが必要です

Public Class ListItemComparer
    Implements IComparer(Of ListItem)

    Public Function Compare(ByVal x As ListItem, ByVal y As ListItem) As Integer _
        Implements IComparer(Of ListItem).Compare

        Dim c As New CaseInsensitiveComparer
        Return c.Compare(x.Text, y.Text)
    End Function
End Class

次に、このComparerを使用してDropDownListを並べ替えるメソッドが必要です。

Public Shared Sub SortDropDown(ByVal cbo As DropDownList)
    Dim lstListItems As New List(Of ListItem)
    For Each li As ListItem In cbo.Items
        lstListItems.Add(li)
    Next
    lstListItems.Sort(New ListItemComparer)
    cbo.Items.Clear()
    cbo.Items.AddRange(lstListItems.ToArray)
End Sub

最後に、DropDownListでこの関数を呼び出します(データバインドされた後)

SortDropDown(cboMyDropDown)

追伸申し訳ありませんが、私の言語選択はVBです。 http://converter.telerik.com/ を使用して、コードをVBからC#に変換します。

2
Dejan

それを試してみてください

-------ストアプロシージャ-----(SQL)

USE [Your Database]
GO


CRATE PROC [dbo].[GetAllDataByID]

@ID int


AS
BEGIN
        SELECT * FROM Your_Table
        WHERE ID=@ID
        ORDER BY Your_ColumnName 
END

---------- Default.aspx ---------

<asp:DropDownList ID="ddlYourTable" runat="server"></asp:DropDownList>

--------- Default.aspx.cs -------

protected void Page_Load(object sender, EventArgs e)

{

      if (!IsPostBack)
            {
                List<YourTable> table= new List<YourTable>();

                YourtableRepository tableRepo = new YourtableRepository();

                int conuntryInfoID=1;

                table= tableRepo.GetAllDataByID(ID);

                ddlYourTable.DataSource = stateInfo;
                ddlYourTable.DataTextField = "Your_ColumnName";
                ddlYourTable.DataValueField = "ID";
                ddlYourTable.DataBind();

            }
        }

------- LINQヘルパークラス----

public class TableRepository

   {

        string connstr;

        public TableRepository() 
        {
            connstr = Settings.Default.YourTableConnectionString.ToString();
        }

        public List<YourTable> GetAllDataByID(int ID)
        {
            List<YourTable> table= new List<YourTable>();
            using (YourTableDBDataContext dc = new YourTableDBDataContext ())
            {
                table= dc.GetAllDataByID(ID).ToList();
            }
            return table;
        }
    }
1
Htun Thein Win

データバインディングにどのようなオブジェクトを使用していますか?通常、Collection <T>、List <T>、またはQueue <T>を使用します(状況に応じて)。これらは、カスタムデリゲートを使用して比較的簡単に並べ替えることができます。 Comparation(T)デリゲートに関するMSDNドキュメント を参照してください。

1
sfuqua

表示された結果をアルファベット順に並べ替えるだけであれば、データベースクエリを入力するときにORDER BYを使用して並べ替えることに同意します。データベースエンジンにソートの仕事をさせてください。

ただし、アルファベット順以外のその他の並べ替え順序が必要な場合もあります。たとえば、新規、オープン、進行中、完了、承認済み、クローズのような論理シーケンスが必要な場合があります。その場合は、データベーステーブルに列を追加して、並べ替え順序を明示的に設定できます。 SortOrderやDisplaySortOrderなどの名前を付けます。次に、SQLで、ソート順フィールドを(そのフィールドを取得せずに)ORDER BYします。

1
DOK
var list = ddl.Items.Cast<ListItem>().OrderBy(x => x.Text).ToList();

ddl.DataSource = list;
ddl.DataTextField = "Text";
ddl.DataValueField = "Value"; 
ddl.DataBind();
1
jasin_89

このJavaScript関数を使用できます。

function sortlist(mylist)
{
   var lb = document.getElementById(mylist);
   arrTexts = new Array();
   arrValues = new Array();
   arrOldTexts = new Array();

   for(i=0; i<lb.length; i++)
   {
      arrTexts[i] = lb.options[i].text;
      arrValues[i] = lb.options[i].value;

      arrOldTexts[i] = lb.options[i].text;
   }

   arrTexts.sort();

   for(i=0; i<lb.length; i++)
   {
      lb.options[i].text = arrTexts[i];
      for(j=0; j<lb.length; j++)
      {
         if (arrTexts[i] == arrOldTexts[j])
         {
            lb.options[i].value = arrValues[j];
            j = lb.length;
         }
      }
   }
}
0
Mrutyunjay

データがSystem.Data.DataTableとして届く場合は、DataTableの.Select()メソッドを呼び出し、filterExpressionに ""を渡し、並べ替えに "COLUMN1 ASC"(または並べ替える列)を渡します。これは、指定どおりに並べ替えられたDataRowオブジェクトの配列を返します。この配列を繰り返し処理して、DropDownListにダンプできます。

0
MusiGenesis

dropDwonListにバインドする前にSourceをソートする方が適切です。ただし、次のようにDropDownList.Itemsを並べ替えます。

_    Dim Lista_Items = New List(Of ListItem)

    For Each item As ListItem In ddl.Items
        Lista_Items.Add(item)
    Next

    Lista_Items.Sort(Function(x, y) String.Compare(x.Text, y.Text))

    ddl.Items.Clear()
    ddl.Items.AddRange(Lista_Items.ToArray())
_

(この場合、文字列(アイテムのテキスト)でソートします。これは、サプライヤーの名前、サプライヤーのIDです)

Sort()メソッドは、すべてのList(of )/_List<MyType>_用であり、使用できます。

0
Logar314159

DropDownListにデータを入力する前にモデル内のデータを並べ替える点で私は同意します。したがって、DBからデータを入力する場合は、単純なを使用してそこにデータを並べ替えることをお勧めしますorder by句を使用すると、Webサーバーでのサイクルがいくらか節約され、DBが非常に高速に実行できると確信しています。これを別のデータソース(XMLファイルなど)から読み込む場合は、LINQを使用することをお勧めします。または、Array.Sortのバリエーションも適しています。

0
bashmohandes

データセットなしでオプションを1つずつドロップダウンに追加し、アイテムを追加した後に後でソートする場合は、次の解決策があります。

DataTable dtOptions = new DataTable();
DataColumn[] dcColumns = { new DataColumn("Text", Type.GetType("System.String")), 
                           new DataColumn("Value", Type.GetType("System.String"))};
dtOptions.Columns.AddRange(dcColumns);
foreach (ListItem li in ddlOperation.Items)
{
   DataRow dr = dtOptions.NewRow();
   dr["Text"] = li.Text;
   dr["Value"] = li.Value;
   dtOptions.Rows.Add(dr);
}
DataView dv = dtOptions.DefaultView;
dv.Sort = "Text";
ddlOperation.Items.Clear();
ddlOperation.DataSource = dv;
ddlOperation.DataTextField = "Text";
ddlOperation.DataValueField = "Value";
ddlOperation.DataBind();

これにより、ドロップダウン項目がアルファベット順にソートされます。

0
n00b

これを試して:

/// <summary>
/// AlphabetizeDropDownList alphabetizes a given dropdown list by it's displayed text.
/// </summary>
/// <param name="dropDownList">The drop down list you wish to modify.</param>
/// <remarks></remarks>
private void AlphabetizeDropDownList(ref DropDownList dropDownList)
{
    //Create a datatable to sort the drop down list items
    DataTable machineDescriptionsTable = new DataTable();
    machineDescriptionsTable.Columns.Add("DescriptionCode", typeof(string));
    machineDescriptionsTable.Columns.Add("UnitIDString", typeof(string));
    machineDescriptionsTable.AcceptChanges();
    //Put each of the list items into the datatable
    foreach (ListItem currentDropDownListItem in dropDownList.Items) {
            string currentDropDownUnitIDString = currentDropDownListItem.Value;
            string currentDropDownDescriptionCode = currentDropDownListItem.Text;
            DataRow currentDropDownDataRow = machineDescriptionsTable.NewRow();
            currentDropDownDataRow["DescriptionCode"] = currentDropDownDescriptionCode.Trim();
            currentDropDownDataRow["UnitIDString"] = currentDropDownUnitIDString.Trim();
            machineDescriptionsTable.Rows.Add(currentDropDownDataRow);
            machineDescriptionsTable.AcceptChanges();
    }
    //Sort the data table by description
    DataView sortedView = new DataView(machineDescriptionsTable);
    sortedView.Sort = "DescriptionCode";
    machineDescriptionsTable = sortedView.ToTable();
    //Clear the items in the original dropdown list
    dropDownList.Items.Clear();
    //Create a dummy list item at the top
    ListItem dummyListItem = new ListItem(" ", "-1");
    dropDownList.Items.Add(dummyListItem);
    //Begin transferring over the items alphabetically from the copy to the intended drop
     downlist
    foreach (DataRow currentDataRow in machineDescriptionsTable.Rows) {
            string currentDropDownValue = currentDataRow["UnitIDString"].ToString().Trim();
            string currentDropDownText = currentDataRow["DescriptionCode"].ToString().Trim();
            ListItem currentDropDownListItem = new ListItem(currentDropDownText, currentDropDownValue);
    //Don't deal with dummy values in the list we are transferring over
    if (!string.IsNullOrEmpty(currentDropDownText.Trim())) {
        dropDownList.Items.Add(currentDropDownListItem);
    }
}

}

これにより、リストアイテムのTextプロパティとValueプロパティを持つ指定されたドロップダウンリストが取得され、指定されたドロップダウンリストに戻されます。幸運を祈る!

0
Vince Pike

データバインドされたDropDownListを使用している場合は、ウィザードに移動して、次の方法でバインドクエリを編集します。

  1. .aspxページ(デザインビュー)に移動します。
  2. ドロップダウンリストの魔法の矢印「>」をクリックします。
  3. 「データソースの設定」を選択します。
  4. 次へをクリックします。
  5. 開いたウィンドウの右側で、「ORDER BY ...」をクリックします。
  6. 並べ替えの基準となるフィールドの条件は2つまであります。目的のフィールドを選択して[OK]をクリックし、[完了]をクリックします。

enter image description here

0
Zag

この方法で簡単にできます

private void SortDDL(ref DropDownList objDDL)
{
ArrayList textList = new ArrayList();
ArrayList valueList = new ArrayList();
foreach (ListItem li in objDDL.Items)
{
    textList.Add(li.Text);
}
textList.Sort();
foreach (object item in textList)
{
    string value = objDDL.Items.FindByText(item.ToString()).Value;
    valueList.Add(value);
}
objDDL.Items.Clear();
for(int i = 0; i < textList.Count; i++)
{
     ListItem objItem = new ListItem(textList[i].ToString(), valueList[i].ToString());
     objDDL.Items.Add(objItem);
}

}

そして、このSortDDL(ref yourDropDownList);メソッドを呼び出します。以上です。ドロップダウンリストのデータが並べ替えられます。

http://www.codeproject.com/Articles/20131/Sorting-Dropdown-list-in-ASP-NET-using-C# を参照してください

0
Mac Chibueze

データセットを返すオブジェクトデータソースをソートするには、コントロールのSortプロパティを使用します。

使用例aspxページでColumnNameの昇順で並べ替える

<asp:ObjectDataSource ID="dsData" runat="server" TableName="Data" 
 Sort="ColumnName ASC" />
0
mikek3332002
        List<ListItem> li = new List<ListItem>();
        foreach (ListItem list in DropDownList1.Items)
        {
            li.Add(list);
        }
        li.Sort((x, y) => string.Compare(x.Text, y.Text));
        DropDownList1.Items.Clear();
        DropDownList1.DataSource = li;
        DropDownList1.DataTextField = "Text";
        DropDownList1.DataValueField = "Value";
        DropDownList1.DataBind();
0
Randy