• ベストアンサー

リストボックスの並び替え

VB.NETについて質問です。 ボタン1をクリックしたら、テキストボックス1に入力した文字を、リストボックス1に登録するとします。 この時、名前、年齢を入力します。 これを、ボタン2、3、をクリックしたら、リストボックスの内容を、名前順、年齢順に並べ替えたいです。 どうしても分かりません。 並べ替えるにはどうしたらいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • herencia
  • ベストアンサー率56% (120/211)
回答No.2

下記のコントロールとコードを追加すると実現できます。 他にも方法はあるのですが、自作のコントロールを作る必要があるので、 この方法が簡単だと思います。 前に作っていたものを少し改造したものなのでもしかしたら不具合があるかもしれません。 (エラー処理などは入っていません。  名前と年齢を一つのテキストで入力したい場合は、  追加ボタンの処理の箇所で、入力された文字列を分割して設定してください。) '下記のコントロールをフォームに追加 リストボックス ListBox1 テキストボックス(年齢) txtAge テキストボックス(名前) txtName ボタン(年齢順) btnSortAge ボタン(名前順) btnSortName ボタン(追加) btnAdd ボタン(削除) btnDel '------------------------------------------------------ ' 下記をフォームの初期処理のコードに追加 ' Form1_Load もしくは Public Sub New() の中に追加 '------------------------------------------------------ Call InitListBox() '------------------------------------------------------ ' 下記をフォームのコードに追加 '------------------------------------------------------ Dim mListBoxDtSet As DataSet Dim mListBoxDtTable As DataTable Dim mListBoxDtView As DataView 'リストボックス削除処理 Private Function DelListBox(ByVal index As Integer) As Boolean Dim dtRow() As DataRow dtRow = mListBoxDtTable.Select("Id = " & index.ToString) If IsNothing(dtRow(0)) = False Then mListBoxDtTable.Rows.Remove(dtRow(0)) Return True Else Return False End If End Function 'リストボックス追加処理(戻り値:追加した項目のIndex="Id") Private Function AddListBox(ByVal age As Integer, ByVal name As String) As Integer Dim dtRow As DataRow dtRow = mListBoxDtTable.NewRow() dtRow("Age") = age dtRow("Name") = name dtRow("DisplayCol") = name & " " & age 'リストボックスへ表示する内容 mListBoxDtTable.Rows.Add(dtRow) Return CType(dtRow.Item("Id"), Integer) End Function 'リストボックス初期化処理 Private Sub InitListBox() 'データセット作成 mListBoxDtSet = New DataSet("ListBoxData") 'データテーブル作成 mListBoxDtTable = mListBoxDtSet.Tables.Add("Hito") Dim pkCol As DataColumn = mListBoxDtTable.Columns.Add("Id", Type.GetType("System.Int32")) pkCol.AutoIncrement = True pkCol.AutoIncrementSeed = 1 pkCol.AutoIncrementStep = 1 mListBoxDtTable.Columns.Add("DisplayCol", Type.GetType("System.String")) mListBoxDtTable.Columns.Add("Age", Type.GetType("System.Int32")) mListBoxDtTable.Columns.Add("Name", Type.GetType("System.String")) mListBoxDtTable.PrimaryKey = New DataColumn() {pkCol} 'データビュー作成 mListBoxDtView = New DataView(mListBoxDtSet.Tables("Hito"), "", "", DataViewRowState.CurrentRows) mListBoxDtView.Sort = "Id" 'リストボックスとデータビューを連結 ListBox1.DataSource = mListBoxDtView ListBox1.DisplayMember = "DisplayCol" ListBox1.ValueMember = "Id" End Sub '年齢順ボタン_クリックイベントハンドラ Private Sub btnSortAge_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSortAge.Click '降順にしたい場合は"ASC"を"DESC"に変更 mListBoxDtView.Sort = "Age ASC" End Sub '名前順ボタン_クリックイベントハンドラ Private Sub btnSortName_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSortName.Click '降順にしたい場合は"ASC"を"DESC"に変更 mListBoxDtView.Sort = "Name ASC" End Sub '追加ボタン_クリックイベントハンドラ Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click Call AddListBox(txtAge.Text, txtName.Text) End Sub '削除ボタン_クリックイベントハンドラ Private Sub btnDel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDel.Click '選択項目存在チェック If ListBox1.SelectedItems.Count = 0 Then Exit Sub End If '選択項目情報取得 Dim rowId(ListBox1.SelectedItems.Count - 1) As Integer Dim dtRow As DataRowView For i As Integer = 0 To ListBox1.SelectedItems.Count - 1 dtRow = CType(ListBox1.SelectedItems(i), DataRowView) rowId(i) = CType(dtRow("Id"), Integer) Next '選択項目該当行削除 For i As Integer = 0 To ListBox1.SelectedItems.Count - 1 Call DelListBox(rowId(i)) Next End Sub

unmeihiraku
質問者

お礼

解決する事が出来ました。 どうもありがとうございました。

その他の回答 (1)

回答No.1

これって名前と年齢は、連結したひとつの文字列として入ってしまってますよね?(リストボックスでは複数のフィールドをもてないはずですから・・・ちがったかな?) だとすると、下のようなっているはず BBBB 13 CCCC 10 AAAA 12   ↑ ここにデータ上の境界がない状態 なので、 名前 年齢 AAAA 12 BBBB 13 CCCC 10 こうすることはできますが CCCC 10 AAAA 12 BBBB 13 こうすることは、できないと思います 名前順だけでよければ ボタン2押下でリストボックスのSortedプロパティをTrueにしてみてください。(並び変わると思います) 名前、年齢両方の並び替えが必須なのであればリストビューコントロールの使用を検討してみてください。 こちらだと、名前と年齢を別々のフィールドに入れられるので、それぞれで並べ替えられるはずだった気がします。 間違ってたらごめんなさい。 (ほかの方も指摘してくださいね)

unmeihiraku
質問者

お礼

プロパティ設定だけでは出来ませんでした。 でも他の方法で解決しました。 どうもありがとうございました。

関連するQ&A

  • リストボックスの全ての内容をテキストボックスに表示するには?

    VB2005初心者です。 ボタン1を押した時にリストボックス1の全ての内容をテキストボックス1に表示さるにはどのようにすればいいのでしょうか? ネットで調べているのですが見つかりません・・。 どうぞよろしくお願いします。

  • リストボックスの使い方

    VB2008エクスプレスを使っています ボタンを押すと画像や文字を表示することは出来るのですが リストボックスにいくつか項目を作り その項目ごとに表示される文字や画像を変えたいんですが どうすればいいのでしょうか? ちなみにボタンコントロールをダブルクリックして PictureBox1.Image = Image.FromFile("C:\Windows\大草原の風.bmp") と文を書くとピクチャーボックスに画像でます ここまでわかるのですが、リストボックスの項目ごとに 画像の種類を変えたりしたいです

  • EXCEL リストボックスについて

    現在、エクセルであることをしようとしているのですが、どうやってやったらいいのかわからないので、ぜひ教えてください。 それと出来るかどうかも教えてください。 内容といたしましては、エクセルのシートの中にあるセルを選んだときにリストボックスを表示して、そのリストボックスにある内容を選んで確定するとその選んだ文字が入るようにしているのですが、入力規則からのリストボックスだとシート自体を小さくすると中の文字が見えなくなり、選びづらくなります。 そこで、コンボボックスで同じことをすると、文字のサイズが大きくなるのですが、印刷時に下向きの矢印も一緒に表示されてしまいます。 そこで、別の視点から考えて、セルを選んだ時にリストボックスみたいなユーザフォームをだし、そこで選んだ文字を選んだセルに表示すれば、印刷時に表示もしないし見た目も良くなると思うのですが、出来そうですか? 出来るのであれば、ぜひ教えてください。 出来れば、VBかVBAで出来るのか、教えてください。

  • テキストボックスによりリストボックスの内容を変える

    Accessのフォームで顧客管理画面を作成しています。 ボタン【日本】【アメリカ】【イギリス】を作成し、 それぞれのボタンをクリックすると、テキストボックス1が 【日本】【アメリカ】【イギリス】 と内容が変化するように作成しました。 また別に「新規登録」ボタンと「国名」コンボボックス1を配置しました。 テキストボックス1が”日本”の時に「新規登録」ボタンをクリックすると コンボボックス1が”日本"と、 テキストボックス1が”アメリカ”の時に「新規登録」ボタンをクリックすると コンボボックス1が”アメリカ"と表示されるようにしたいです。 どのようにコードを書けばいいでしょうか? ちなみに新規登録のコードは以下です。 On Error GoTo Err_c新規登録_Click DoCmd.GoToRecord , , acNewRec Exit_c新規登録_Click: Exit Sub Err_c新規登録_Click: MsgBox Err.Description Resume Exit_c新規登録_Click ご教授お願いいたします!

  • テキストボックスの中身消去

    VB6.0です。 テキストボックスに入力されている文字を、ボタンをクリックしたときに中身を消去するにはどうしたらよいでしょうか?

  • リストボックス項目の順番を入れ替える方法

    リストボックス内に10個ほどの項目があります。 ある項目を選択し、ボタンAをクリックすると、その項目が1つ上に移動し、 ボタンBをクリックすると、その項目が1つ下に移動するようにしたいのです。 ウグイス ホトトギス フラミンゴ ↓ フラミンゴを選択し、ボタンAをクリックします。 ↓ ウグイス フラミンゴ ホトトギス 使用ツールはVB.NET2003です。 テキストファイルから読み込んだデータをリストボックスに入れ、順序を入れ替えてから、上書き保存しようとしております。 何か良いアイディアありましたら、是非教えてください。 どうぞよろしくお願いします。

  • 入力値をListボックスに表示させたい。

    (仕様1) ユーザーフォーム1でテキストボックス1~5に 入力した値をListボックスに表示させたい。 例えば textbox1=A,textbox2=B,textbox3=C・・・ と入力されたら、 A B C D E のように順に横方向一列に表示させるようにしたいです。 (仕様2) これをコマンドボタン1を押す度にリストボックス1に新しく追加されていく 様にしたいのですが、できますでしょうか。 例えば、 A B C D E A C D B E (テキストボックスに入力後ボタン1を押す) A C B D E (テキストボックスに入力後ボタン1を押す)

  • リストボックスから選択したデーターの一つだけを取得する

    VB5.0を使っています。 WIN2000です。 MDBとVBを使っています。 まず、顧客ID・顧客氏名・電話番号  この3つが1つのデータとして横並びの文字列で、リストボックスに表示されてゆきます。 リストボックスに表示したデータを選択し、その選択したデータの”顧客ID”だけを取り出して同じフォーム内のテキストボックスにいったん出し、そこから別のフォームに飛んでその”顧客ID”を元にデータの詳細を出す、といったものを作っていますが、 今のわたしの書いてるコードだけでは、何番の顧客IDを出しても、 別のフォーム(契約入力)に行くときには同じ1番の人のデータ詳細しか出ません。 「リストボックスから選択したデーターの一つだけを取得する」 には、どのようなコードを書けばいいか、教えていただけないでしょうか・・。 リストボックス(List1)から選択してテキストボックス(Text5)に取得する際にはすでに”顧客ID”だけを取り出したいのです。 今のコードでは、顧客ID・顧客氏名・電話番号 とすべてテキストボックス(Text5)にでてきてしまいます。 Private Sub cmnd2_Click()’選択ボタンclickでリストボックスのデータを取得。 Dim ListIndex As Integer Dim SelectedIndex As Integer Text5.Text = List1.List(List1.ListIndex)'→ここでリストボックスからデータを取得しています。 End Sub

  • リストボックスの内容をテキストボックスに表示する。

    タイトルどおりなんですが、リストボックスの内容をテキストボックスに表示することが出来ません。 といっても、普通に表示することは出来たのですが、 今やっていることは、テキストボックスの中にある文章を表示しておいてカーソルがある部分にリストボックスの内容を表示する。。というものです。 (例) テキストボックスの中身が 「おはようございます。今日の天気はです。」 リストボックスの中身が 晴れ・曇り・雨 このとき「~天気は(ここにカーソルがある)です」 あるボタンを押すことで(ダブルクリックでもどちらでも良い) テキストボックスの内容が 「~天気は晴れ(リストボックスで選択したアイテム)です。」 と表示できるようにしたいのです。どうしても文末にしか表示することが出来ませんでした。長文で分かりづらい点が多々あると思いますが、 良い方法があれば教えてください。

  • ACCESSでコンボボックスからの入力でリスト外の追加をフォームを使っ

    ACCESSでコンボボックスからの入力でリスト外の追加をフォームを使って登録 ACCESSのフォームを使ってデータ入力を作成しています、"顧客名"をコンボボックスを使って選択するようにしていますが。 リスト外の新規顧客を入力する際には別の"顧客登録"フォームが開いて、顧客情報(読み仮名、顧客名、都道府県コード、所在地)を入力して、閉じると登録した"顧客名"がコンボボックスから選択できるようにしたいと思い、マクロを使用して(VBはよくわからないので) イベント→リスト外入力時→”顧客登録”フォームが開く 必要事項を入力し、閉じるボタンをクリック。 してみたのですが、コンボボックスのリストに先に入力した新規データが出てきません。 何が足りないのかご教授お願いいたします

専門家に質問してみよう