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

いくつか同じ質問は見受けられましたが、自分の環境ではどれも解決に至っていなく困っていますので、質問させてください。

DataGridViewのDataSourceにDataTableを設定して使っています。

このDataGridViewは、編集もできソートもできます。ただ、ソートは、ヘッダをクリックした時など、ユーザーが意図したときだけ起きて欲しく、例えばソート列の値を編集したときなどに、勝手に位置が変わってしまします。

これを、止める方法はないのでしょうか。しかも、それまでに任意のソートを繰り返した後の、編集を加える直前の順番を保ったままです。

ソートを解除するという方法がありましたが、ユーザーが編集直前までに整えた順番をクリアして、最初の状態に戻してしまいます。それでは、都合が悪いのです。


本当に困り果てています。どうか、分かる方教えていただけませんか?

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

A 回答 (4件)

#1です。



#2の補足

#2ですが 支店でーソート(昇順)で 入力後、他の行をクリックしたら ソートされるようです。

編集直後ではなく あくまで 他の行にクリックした場合です。

これは 仕様のように思えます。

もし、このことをおっしゃっているのであれば ソート後で データを検索し、カーソル位置(行位置)
をもとに戻すしかないとは思いますが。

この回答への補足

当然、セルの値を編集し、別のセルに移るなどして値がコミットされた瞬間です。編集中は、セル上に表示された編集用コントロールの上で表示が書き換えられているだけですので、まだソートは起こりませんよね。
もちろん、それが確定されコミットされた時の話です。

同じ現象を分かっていただけたようですね。

そして、それが標準仕様であることももちろん分かっています。
それを承知の上で、なんとか解決策を模索していたわけです。

だって、普通に考えて、迷惑な挙動だと思いませんか? 閲覧専用のリストとして使う分には、全く問題ないですが、編集もできるリストで勝手にソートされては、編集しづらいですよね?


なので、仕方なく編集直前のソート位置を記憶する隠し列を作って対応しました。目的の動作はするようになりましたが、もっとスマートな根本解決に近い方法を探している途中です。

補足日時:2009/12/29 17:16
    • good
    • 0

私も以前同じ所で困っていました



http://dobon.net/
こちらのサイトでTipsがあるので参考にされては?

この回答への補足

サイト情報ありがとうございます。
すみませんが、そのサイト内の、どの記事でしょうか?
IDか検索キーワードを教えていただけると助かります。

おねがいします。

補足日時:2009/12/29 17:26
    • good
    • 0

>>3行目の103のセルを編集して107に変更したとたんに、勝手にソートされその行は5行目に移動してしま>>い、リストは、上から順番に 101,102,104,105,107となってしまいます。



これは質問者さまの プログラムにそのようになるコードが実装されているからと推測します。


ためしに以下のデータをサンプル(マイクロソフト NorthWindow DB)から作ってみました

===========================================================================

販売コード支店販売日商品個数売上
1池袋2009/10/05 13:54:30オレンジジュース5\1,250
2上野2009/10/05 0:20:11コーヒー10\1,800
3上野2009/10/05 1:05:18グレープジュース10\2,500
4上野2009/10/05 8:57:54紅茶10\1,800
5新宿2009/10/05 22:47:22オレンジジュース7\1,750
6上野2009/10/05 1:17:03グレープジュース6\1,500
7渋谷2009/10/05 14:56:41コーヒー4\720
8渋谷2009/10/05 19:54:55紅茶7\1,260
9品川2009/10/05 21:51:47オレンジジュース8\2,000
10品川2009/10/05 5:51:16グレープジュース3\750
11上野2009/10/06 0:22:37グレープジュース3\750
12新宿2009/10/06 19:10:24オレンジジュース2\500

===========================================================================

このデータを Test.MDB に 「売り上げ」 とういうテーブルを作成します。

VB.NET 2005 にて 新しいプロジェクトを作成

Windows フォーム Form1 上に メニューからデータ/新しいデータ接続 を実行し

先に作成した MDB に接続してください。


データーソースのウインドウより テーブル「売り上げ」をForm1 上に
ドラッグ&ドロップすると 自動的にデータグリッドの配置がされます。

まずはこれで 実験してください。


これで デフォルトでは販売コード で表示されている状態で 支店を昇順になるようにヘッダー
をクリックしてソートしたとしましょう

たとえば 販売コード 8番 のデータの 支店が 渋谷 → 池袋 に変えてみてください。

ソートは起こりません。 もう一度 ヘッダーの支店をクリックするとソートします。

===========================================================================

ということでので 実装している コードに問題があるように思えます。
    • good
    • 0

もう少し、話を整理することが必要です。



>>、ヘッダをクリックした時など、ユーザーが意図したときだけ起きて欲しく、例えばソート列の値を編集したときなどに、勝手に位置が変わってしまします。


つまりカーソル位置が、何処にあれば正解なのでしょうか?

ソートすればデータの位置は変わるのはあたりまえなのでは。

編集終了時のデータ たとえば伝票番号順で 編集していたとき その列に含まれる 氏名(かな)などの列をクリックしたとしましょう。(この場合は氏名(かな)でソートされます。)

当然、伝票番号の順番ではなくなりますよね 元の位置は、ぜんぜん違う場所になってしまうかもしれません。

こういう場合は、どうするのでしょうか?

このように やりたいことを明瞭かつ簡単に 箇条書きで書いてください。

何が困っているのかが第3者にはつたわりません。

具体的にお願いします。現状の状態から あるアクションがあったらこうしたい。
など、データのサンプル などを提示してください。

データグリッドビューは 列ごとにソートの可否を決定できます。

ソート後にもとの行位置に戻したい場合は 検索すれば もとの位置に戻すことは可能です。

どの列が固定し、どの列が クリックしたら ソートし、編集行のもとの行位置に戻すのか 明確にしてください。

この回答への補足

「ソート列の値を編集したとき」この表現が分かりにくかったのでしょうか?すみません。

例えば、もともとは、データベースのID順など、目的とは違う別の列でソートされていたリストに対して、伝票番号の編集をするため、DataGridViewのヘッダをクリックして、分かりやすいように、伝票番号の列で昇順にソートし直したとします。

その状態で、具体的には伝票番号の列の1行目から5行目には、101,102,103,104,105という値が入っているとします。

3行目の103のセルを編集して107に変更したとたんに、勝手にソートされその行は5行目に移動してしまい、リストは、上から順番に 101,102,104,105,107となってしまいます。

ユーザからすると、107に変えたはずの3行目にカーソルがあるままなのに、そこにはソートされて順番が変わった元4行目の104が来ている、ということになり、編集中に行が変わってしまっては、作業がやりづらいことになります。

編集を終え、ユーザーが意図的にもう一度ソートをするまでは、101,102,107,104,105の順番でいて欲しい・・・。

という意味でした。

エクセル上で、範囲を指定してデータの並べ替えをするのと同じ感覚て、ユーザが「ソート」の操作をしたときだけ並べ替えが起こって、それ以外の時、具体的には、リスト内のデータを編集しているときには勝手に順番が変わらないようにしたいのです。

補足日時:2009/12/25 21:38
    • good
    • 0

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

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

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

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

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

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

こんにちは。

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

Aベストアンサー

こんばんは.

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

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

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

Qdatagridviewの並べ替え

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

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

Aベストアンサー

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

参考URL:http://msdn.microsoft.com/ja-jp/library/ms171608.aspx

QVB.NET2005 DataGridViewでレコードを絞り込んで表示

Form1のTextboxより入力した数字を元にForm2のload時にoracleDBをselectしDataGridviewのテーブルの中に作成した値と一致するものを絞り込んで表示したいと考えております。
メニューのプロジェクトからDataSetを選択し、必要なDBを選択しTableadapter等も利用しています。
DBから読み込んだものをそのまま表示するだけという事は出来ました。
テキストやネットを調べながら色々試してみましたが、うまくいかず煮詰まっています。
お力を貸してください。よろしくお願いします。

Aベストアンサー

お世話になります。

TableAdapter から取ってきた DataTable を元に
DataView を使って絞り込めばよいのでは?

Dim dt As DataTable = New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("FRUIT", GetType(String))

dt.Rows.Add(New Object() {1, "りんご"})
dt.Rows.Add(New Object() {2, "もも"})
dt.Rows.Add(New Object() {3, "かき"})
dt.Rows.Add(New Object() {4, "みかん"})

Dim dv As DataView = New DataView(dt)
dv.RowFilter = "FRUIT LIKE '%ん%'" '絞り込み

Me.DataGridView1.DataSource = dt '全件
Me.DataGridView2.DataSource = dv '絞り込まれた結果(りんごとみかん)

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/129dgfilter/dgfilter.html

お世話になります。

TableAdapter から取ってきた DataTable を元に
DataView を使って絞り込めばよいのでは?

Dim dt As DataTable = New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("FRUIT", GetType(String))

dt.Rows.Add(New Object() {1, "りんご"})
dt.Rows.Add(New Object() {2, "もも"})
dt.Rows.Add(New Object() {3, "かき"})
dt.Rows.Add(New Object() {4, "みかん"})

Dim dv As DataView = New DataView(dt)
dv.RowFilter = "FRUIT LIKE '%ん%'" '絞り込み...続きを読む

QDataGridViewの特定列に入力されている重複チェックをしたい

VisualBasic2005です。
例えばDataGridViewの3列目にコードが入力されるとします。
その列のコードには重複入力をさせたくないのです。

重複チェックをするのは、そのセルの入力が確定したときでも、
特定のボタンが押されたときでもかまわないので、
チェックする方法はないでしょうか?

よろしくお願いいたします。

Aベストアンサー

そのDataGridViewはDataTableをバインドしてますか?
もしそうなら、DataTableの方で重複をさせたくない列を主キーに設定すれば、重複値を入力したときエラーがでるようになります。
主キーの設定の仕方は例えば
'dtはDataTable
dt.PrimaryKey = New DataColumn() {dt.Columns(2)}

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」になっ...続きを読む

QGridViewで列のソートを無効にしたい

お世話になります、VB.NET2005です。

GridViewで、列ヘッダをクリックするとソートがかかるところを無効にしたいのですが、どのように設定したらいいか分かりません。
できれば列ヘッダをクリックできないように設定したいのですが・・・。
列ヘッダだけEnableをFalseみたいな事ってできますでしょうか?

Aベストアンサー

こんにちは
DataGridViewのcolumnsプロパティをクリックして
該当するカラムのSortModeをNotSortableに設定すればソートしません。

QDatagridViewの値確定

VB2005です。
DataGridViewを私用しています。
EditModeはEditOnEnterです。
特定のセルの値を変更し、カーソルがその列から移動していない状態で、
Buttonコントロールをクリックすると、ボタンクリック時のイベントの前に、
そのセルのCellValueChangedイベントが発生します。
が、同じ要にセルの値を変更し、カーソルがその列から移動していない状態で、
HScrollBarコントロールをクリックすと、CellValueChangedイベントが発生しません。
そうすると、変更した値が反映されず、前の値で処理が進んでしまいます。
HScrollBarコントロールをクリックしたときも、DataGridViewの値が
確定される方法はないでしょうか。

よろしくお願いいたします。

Aベストアンサー

CurrentCellDirtyStateChangedイベント内で、CommitEditを呼ぶとか・・・

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender...
  If Me.DataGridView1.IsCurrentCellDirty Then
    Me.DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
  End If
End Sub
(注意!表示の関係上、半角スペースは全角スペースになっています)

QDataGridViewで変更した値を反映させたい。

VB2005、SqlServer2005環境です。

デザイナ上で、DataTableをドラッグしてやると、自動的に
バインドされたDataGridViewが出てくれるので、その方法で
DataGridViewを1つ設置しました。

このDataGridViewの表の値を変えた時、それを実際のDBのテーブルにも
反映させたいなと思ってます。
これを実現するための方法を教えていただけないでしょうか?
バインドされているので、保存できればそのまま更新されるような
イメージなのですが…その方法がわかりません。

宜しくお願いします。

Aベストアンサー

ビューからだとUpdateやDeleteなど元のテーブル対する操作は自動生成されないようです

フォームに張り付いているデータセットにクエリを追加して
テーブルを操作できるようにします
表示されているテーブルアダプタをアクティブにして データ > 追加 > Queryを実行
SQLステートメントを使用するにチェック で次へ
UPDATE で次へ
ここで クエリビルダ もしくは 直接SQLを編集し『完了』をクリック

フォームに更新用ボタンを配置
そのクリックイベントに

dim row as DataRow
for each row in DS.DaTable.Rows
  if row.RowState = DRowState.Modified then
    TableAdapter.UpdateQuery( Row("Name"), Row("ID") )
  end if
next
といった具合で更新を掛けます
# 変数名などは適宜修正してください
# DS.DaTable.Rows、TableAdapter、Row("Name"), Row("ID")などです

ビューからだとUpdateやDeleteなど元のテーブル対する操作は自動生成されないようです

フォームに張り付いているデータセットにクエリを追加して
テーブルを操作できるようにします
表示されているテーブルアダプタをアクティブにして データ > 追加 > Queryを実行
SQLステートメントを使用するにチェック で次へ
UPDATE で次へ
ここで クエリビルダ もしくは 直接SQLを編集し『完了』をクリック

フォームに更新用ボタンを配置
そのクリックイベントに

dim row as DataRow
for each row in DS.Da...続きを読む

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

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

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

宜しくお願い致します。

Aベストアンサー

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


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

人気Q&Aランキング