親子におすすめの新型プラネタリウムとは?

VB2005でDataGridViewを使用して属性番号、日時順、電圧値といったデータ行を表示させています。
複数のcsvファイルから読み込んで表示させていますが、この表示を属性番号順・日時順といった順で並べ替えをしたいのです。
DataGridView.Sortメソッドを使用して
日時列→属性番号列といった順で連続的にソート処理をしています。
が、上手くいきません。
年末の忙しいところ皆さん申し訳ないのですが、知っている方教えて下さい。
最終的には属性順には並んでいますが、最初の日時順が崩れてしまっています。
日時順を元に属性番号順に並べ替える時に、並び順が下がる対象行があるとします。
この並び順が下がる行データの移動先の位置にあった行データが日時を無視して入れ替わりに上がってきてしまっています・・・

よろしくお願いしますm(__)m

このQ&Aに関連する最新のQ&A

A 回答 (3件)

noah7150さんが紹介しているページの日本語版です。



下記URLの
「IComparer インターフェイスを使用したカスタムの並べ替え」
をコピペして動かしてみてください。

' If the Last Names are equal, sort based on the First Name. 
とコメントがあるので、
Last Namesが同じだったら、First Nameでソート・・・
という処理をしているんだと思います。

わかりにくい場合、グリッドの中身を数値に置き換えてみると
わかりやすいかもしれません。

とりあえず動かしてみるとわかると思います。

http://msdn.microsoft.com/ja-jp/library/ms171608 …

参考URL:http://msdn.microsoft.com/ja-jp/library/ms171608 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
無事解決しました。
年末年始体調不良で寝込んでまして、なかなか確認作業ができずにお礼が遅れスミマセンでした。。。

因みに上手くいかなかった方法は市販の書籍に掲載されていた
dataGridView.sort(column,direction)を使用して
column=0を実行後、続けてcolumn=1を実行していました。

この方法は間違ったやり方だったのでしょうか?
それともVBのバグですかね?

お礼日時:2009/01/06 14:26

こんにちは。



> この方法は間違ったやり方だったのでしょうか?
> それともVBのバグですかね?
やりたいことが複数のソートキーでの並び替えということだったので、
やり方的に間違ってるような気がします。

カラム名を渡すやり方は、ソートキーは1つしか指定できないっぽいので。
DataGridView.Sortメソッドを使って複数条件でソートする場合はharajapanさんが解決したやり方じゃないとできないみたいです。

バグではないと思います。
    • good
    • 0
この回答へのお礼

再三のご回答ありがとうございました。
何となくエクセル感覚で行くとシングルソートを連続して2回やればできるのではと思い込んでいました。
以後はご教示頂いた手法で行う様にします。
ありがとうございました。

お礼日時:2009/01/13 09:09

参考になれば


DataGridViewを複数カラムでソートする手法です。

http://dobon.net/vb/bbs/log3-22/13851.html

参考URL:http://dobon.net/vb/bbs/log3-22/13851.html

この回答への補足

早速のご回答ありがとうございます。

・・・すみません。
初心者なもので、参考サイトを見ましたが、よく理解できませんでした。
もう少し、かみくだいて教えて頂けませんでしょうか。

よろしくお願いしますm(__)m

補足日時:2008/12/22 20:11
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridViewの複数列を連動してソートしたい。

早速質問させていただきます。

VB2005+MSDE2000でWindowsアプリを作成しています。
Form上に非バインドのDataGridViewがあります。
日付、連番、名前の列を持っているとします。
非バインドのままで日付昇順で且つ連番昇順でソートする事は可能でしょうか?
データベースから呼び出してきた時はこのようになっているのですが、追加などを行うと崩れてしまいます。

ご教授の程、よろしくお願い致します。

Aベストアンサー

検索したら以下のようなものがありました。
(2)のリンクの先は英語ですが、がんばってみてください。
おそらく、ICompareの中でロジックを書き込めばできるのかなとは思いました。
================================================================
(1)
http://msdn2.microsoft.com/jajp/library/system.windows.forms.datagridview.sort(VS.80).aspx
(2)
http://dobon.net/vb/bbs/log3-22/13851.html
================================================================

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

Qdatagridviewに行追加し、値を入れたいです。VB.NET 

'データグリッドの選択された値を変数frowに代入する。
frow = DataGridView1.SelectedCells.Item(0).Value
'データグリッドの選択された値を変数srowに代入する。
srow = DataGridView1.SelectedCells.Item(1).Value
'データグリッドに新しい行を追加する。
KYU70000_1.DataGridView1.Rows.Add(DataGridView1.Rows)
KYU70000_1.DataGridView1.Rows.Add(DataGridView1.Rows)
'選択された値をKYU70000_1のデータグリッドに代入する。
frow = KYU70000_1.DataGridView1.SelectedCells.Item(0).Value ←ここがインデックスが範囲を超えています、となります。
srow = KYU70000_1.DataGridView1.SelectedCells.Item(1).Value
どうすれば良いのでしょうか?教えてください。意味が分かりません。

'データグリッドの選択された値を変数frowに代入する。
frow = DataGridView1.SelectedCells.Item(0).Value
'データグリッドの選択された値を変数srowに代入する。
srow = DataGridView1.SelectedCells.Item(1).Value
'データグリッドに新しい行を追加する。
KYU70000_1.DataGridView1.Rows.Add(DataGridView1.Rows)
KYU70000_1.DataGridView1.Rows.Add(DataGridView1.Rows)
'選択された値をKYU70000_1のデータグリッドに代入する。
frow = KYU70000_1.DataGridView1.SelectedCells.Item(0).Value ←ここ...続きを読む

Aベストアンサー

>frow = KYU70000_1.DataGridView1.SelectedCells.Item(0).Value ←ここがインデックスが範囲を超えています、となります。
>srow = KYU70000_1.DataGridView1.SelectedCells.Item(1).Value

選択した値をグリッドに入れるならこうじゃないでしょうか?
KYU70000_1.DataGridView1.SelectedCells.Item(0).Value = frow
KYU70000_1.DataGridView1.SelectedCells.Item(1).Value = srow

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QDataGridViewの昇順降順。

再びお世話になります。
VB2005で表題の件ご教授願います。
作成した表でカラムスヘッダーをクリックすることによりソートは可能状態です。しかし、数値データを表示させていていて昇順、降順とも文字列としの結果で数値の大小でソートされません。
プロパティでColumnsからCellStyleビルダのFormatを数字に選択しても結果はかわりません。
以上よろしくお願いします。

Aベストアンサー

こんにちは
以下のURLを参考にしてみたらどうでしょうか。
この中の「SortCompareイベントを使用する方法」
のソースを以下のように改造すれば数値の大小でSort可能です。
Private Sub DataGridView1_SortCompare(ByVal sender As Object, _
ByVal e As DataGridViewSortCompareEventArgs) _
Handles DataGridView1.SortCompare
 e.SortResult = Val(e.CellValue1) - Val(e.CellValue2)
 e.Handled = True
End Sub
入力データなどのチェックはしていませんので留意してください。

参考URL:http://dobon.net/vb/dotnet/datagridview/customsort.html

Qデータグリッドビューの一番最初の行に列を追加したい

お世話になっています。
VB2005です。
タイトル通りなのですが、DataGridViewの一番最初の列(0列目)に列を追加したいのです。
DataGridView1.Columns.Add()
では一番最後の行に追加されてしまいます。

ヘルプやネット上を見てもわからず・・・
どなたかご存じの方教えてください。

Aベストアンサー

こんばんは。

AddではなくInsertを使います。

TextBoxColumnを追加します。

Dim TextBoxColumn As New DataGridViewTextBoxColumn
Me.DataGridView1.Columns.Insert(0, TextBoxColumn)

でとりあえず追加できます。

後はヘッダーに項目名を設定したり、列幅を設定し足してください。

QDataGridViewのチェックボックスのON、OFFの判定方法

お世話になります。ご協力お願いします。
環境:VS2008 .Net FrameWork3.5
言語:C#

質問内容:ボタンを押下したら、DataGridViewの列に設定したチェックボックスのON,OFFを判定して処理を行いたい。
現状以下の方法で実現は出来ていますが、とても回りくどい方法になっています。
正しい処理を教えて頂けないでしょうか。

1.DataGridViewにて、列にチェックボックスを設けている。
2.truevaluesプロパティにtrueをセットしている。

ボタンを押下したらチェックボックスのON、OFFを判定する為に、DataGridViewの行を
ループさせて判定させています。

for(int i=0;i < DataGridView.Count;i++){
___if((string)DataGridView.Rows[i].Columns[0].values == "true")
___{
______処理
___}
}

お願い致します。

Aベストアンサー

 こんばんは。

 正しいかどうかは断言出来ませんが、要はチェックボックスの「on, off」を確認しながらループするのが非効率的なので、ループ回数を「on」の個数だけに留めたいと言う事でしょうか。

 でしたら、以下URLに記載されているイベントハンドラを応用して、
 http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html

 セルのチェックボックスが「on, off」された瞬間に、セルのROW番号をハッシュテーブルに向かって「登録、解除」をしていけば、結果として「on」になっているセルのROW番号だけを保持する事になります。

 「Dictionaryジェネリッククラス」
 http://msdn.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx

 以下参考程度に。

//ハッシュテーブル(trueのROW番号だけを記録するDictionary<Key, Value>だが、今回の事例では両方とも同じROW番号を入れる)
private Dictionary<int, int> boolMapper;

private void Form1_Load(object sender, EventArgs e)
{
//作成
this.boolMapper = new Dictionary<int, int>();
}

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (this.dataGridView1.CurrentCellAddress.X == 0 && this.dataGridView1.IsCurrentCellDirty)
{
this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}

//チェックボタンが「on, off」された瞬間に呼ばれるイベントハンドラ
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && this.dataGridView1.Columns[e.ColumnIndex].ValueType == typeof(bool))
{
//チェックボタンが「on」になったのでハッシュテーブルに登録
if ((bool)this.dataGridView1[e.ColumnIndex, e.RowIndex].Value == true)
{
this.boolMapper.Add(e.RowIndex, e.RowIndex);
}
//チェックボタンが「off」になったのでハッシュテーブルから除外
else
{
this.boolMapper.Remove(e.RowIndex);
}
}
}

//ボタン1を押した時に呼ばれるイベントハンドラ
private void button1_Click(object sender, EventArgs e)
{
//ハッシュテーブルの要素個数分だけ回転する
foreach(KeyValuePair<int, int> kvp in this.boolMapper)
{
//ココで何かする「kvp.Value / kvp.Key」どちらにも同じ数字が入っているのでどちらを使用するかは問わない
this.dataGridView1[0, kvp.Value];
}
}

 こんばんは。

 正しいかどうかは断言出来ませんが、要はチェックボックスの「on, off」を確認しながらループするのが非効率的なので、ループ回数を「on」の個数だけに留めたいと言う事でしょうか。

 でしたら、以下URLに記載されているイベントハンドラを応用して、
 http://dobon.net/vb/dotnet/datagridview/datagridviewcheckboxcolumn.html

 セルのチェックボックスが「on, off」された瞬間に、セルのROW番号をハッシュテーブルに向かって「登録、解除」をしていけば、結果として「on」になっ...続きを読む

QDataGridViewの、選択されている行を取り出したい

いつもお世話になっております。

DataGridViewに関して、選択されているレコードをDataRow型で別フォームに渡してから、各項目をテキストボックスに表示したいのですがうまくいきません(DataRow型にこだわっているわけではないのですが、レコード1件丸ごと取得する型を他に知らないので例として挙げました)。

DataGridViewのCurrentRowプロパティや、SelectedRows(0)をDataRow型に代入する試みをしましたが、型変換できませんでした。

DataGridViewで選択されているレコード一件まるごと変数に渡す方法というのはあるのでしょうか?

ちなみに、SelectionModeはSelectFullRowに、MultiSelectはFalseにしてあります。

ご存知の方ご教授いただけると助かります。
よろしくお願いします。

Aベストアンサー

>おっしゃるとおりやってみたのですが、どうもやはり型変換ができませんでした。
>参照しているのはDataTable型なわけですから、DataRowも取り出せそうな気はするのですが。。。

えー・・・スイマセン
今度はコーディングして確認してみたところ、
なにやら、1ステップすっ飛ばしていました

下記の手順にて取得可能です

[C#]
System.Windows.Forms.DataGridViewRow dgr = this.DataGridView1.CurrentRow;
System.Data.DataRowView drv = (System.Data.DataRowView)dgr.DataBoundItem;
System.Data.DataRow dr = (System.Data.DataRow)drv.Row;

[VB2005]
Dim dgr As System.Windows.Forms.DataGridViewRow = Me.DataGridView1.CurrentRow
Dim drv As System.Data.DataRowView = CType(dgr.DataBoundItem, System.Data.DataRowView)
Dim dr As System.Data.DataRow = CType(drv.Row, System.Data.DataRow)

※最後のキャストを変更すれば、型付データセットにも対応可能のはずです

>おっしゃるとおりやってみたのですが、どうもやはり型変換ができませんでした。
>参照しているのはDataTable型なわけですから、DataRowも取り出せそうな気はするのですが。。。

えー・・・スイマセン
今度はコーディングして確認してみたところ、
なにやら、1ステップすっ飛ばしていました

下記の手順にて取得可能です

[C#]
System.Windows.Forms.DataGridViewRow dgr = this.DataGridView1.CurrentRow;
System.Data.DataRowView drv = (System.Data.DataRowView)dgr.DataBoundItem;
System.Data...続きを読む

QDataGridViewでセルクリックイベントを発生させるには

DataGridViewでセルクリックイベントを発生させるには、
デザイナからではCellClickイベントハンドラとなりますが、
プログラムコード上から発生させるにはどのようにすればよろしいでしょうか?

CurrentCellでアクティブセルを変更した時に、そこのセルをクリックさせるイベントが欲しいのですが・・

宜しくお願い致します。

Aベストアンサー

CellClickイベントハンドラの内容を別のメソッドとして作り、アクティブセルを変更した際にそのメソッドを呼び出す方法ではダメなのでしょうか?
どうしてもCellClickイベントを発生させて処理をしたいのでしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング