• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB.NETでDataGrid_ItemDataBoundで、あるタイトルの名前を変更するとそのタイトルだけ並べ替えができない)

VB.NETでDataGrid_ItemDataBoundで、あるタイトルの名前を変更するとそのタイトルだけ並べ替えができない

このQ&Aのポイント
  • VB.NETでプログラムをつくっています。DataGridで表を作ったのですが、あるタイトルの名前を変更するとそのタイトルだけ並べ替えができない(タイトルがただのテキストになってアンダーバーがついていない)
  • DataGridの初期設定は並べ替えができるようになっています。CELL1~6は並べ替えができます。上記テキストに入れる文をコメントアウトすると、CELL7,8,9も並べ替えができます。なぜなのでしょうか?

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

  • ベストアンサー
回答No.1

お世話になります。 ASP.NET ですよね? それで、ItemDataBound で 質問者様の処理を行うと AllowSorting が意味を成さなくなってしまうと 読み取ったのですが、そういう事ですよね。 以下は検証コードです。 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   ' ページを初期化するユーザー コードをここに挿入します。   If Not IsPostBack Then     Dim dt As DataTable = New DataTable     dt.Columns.Add("Field1", GetType(String))     dt.Columns.Add("Field2", GetType(String))     dt.Columns.Add("Field3", GetType(String))     dt.Rows.Add(New String() {"りんご", "みかん", "ばなな"})     dt.Rows.Add(New String() {"おかし", "ごはん", "おちゃ"})     Me.DataGrid1.DataSource = dt     Me.DataGrid1.DataBind()   End If End Sub Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound   If e.Item.ItemType = ListItemType.Header Then     e.Item.Cells(0).Text = "項目1"     e.Item.Cells(1).Text = "項目2"     e.Item.Cells(2).Text = "項目3"   End If End Sub > なぜなのでしょうかー? そうなってしまうはっきりとした理由については調べ切れていないのですが、 多分ですけども DataGrid.SortCommand イベントの 引数にある DataGridSortCommandEventArgs クラス http://msdn2.microsoft.com/ja-JP/library/system.web.ui.webcontrols.datagridsortcommandeventargs.aspx の解説を読むと、SortExpression の記述があります。 ここがどうも、臭そうな感じがします。 <引用> 自動的に生成された列の場合、SortExpression プロパティにはデータ フィールドと同じ値が格納されます。これらのリンクにより、選択した列ごとに DataGrid コントロールを並べ替えることができます。 </引用> とありますので、 上記の検証コードのように、自動生成列の場合は、ご丁寧に内部で項目名と DataSource の項目名の整合性が取れているか チェックをやっていて、整合性がとれていないばあいは、AllowSorting を無効にしているのかもしれません。 それで、もし項目名を変えたいという事だけでしたら、 可能であればですが、ItemDataBound で DataGrid の表示項目を変えるのではなくて、 DataSource につかう DataTable の項目名を最初から表示したい値にしておくのはいかがでしょうか。

Haule
質問者

お礼

ありがとうございます! DataSourceのDataTableの変更でできました~ しかし、新たな問題が>< 並べ替えを行なうときに、DataGridに表示されている名前で、SortCommandかける為、データベースで取得した際のDataSetでのソートする項目タイトルと相違がでてしまうといったことになってしまいました。 この質問に関しては解決できましたので終了します。 新質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2296211 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Select Case について教えてください VB.NET

    VB.NET2003環境なのですが、 アイテムが4個登録されたコンボボックスの選択状態を振り分ける Select Case なのですが、 Case Is = -1 Case Is = 0 Case Is = 1 Case Is = 2 Case Is = ComboBox6.Items.Count - 1 End Select となっていて、選択なし、選択0~2、最後の選択を 振り分けたいのですが、アイテムの数が増えると たくさん書かなくてはならないのですが、 If みたいいorのように指定することは出来ないでしょうか? 宜しくお願い致します

  • DataGridの値での場合分けの方法について

    今回初めて質問をさせていただきます。 ASP.NETとVB.NETでWebアプリケーションの開発をしているのですが、まだ始めたばかりでDataGridの使い方がよくわからなくなり、質問させていただくことにしました。 DataGridに取得したある列の値が3種類あり、DataBindした後に、この3つの値での場合分けをしたいです。 select文を使うとして、 Select Case 【DataGridのA列のDataField】 Case 0 処理1 Case 1 処理2 Case 2 処理3 End Select のようにしたいのですが、 【DataGridのA列のDataField】の部分をどのように書いたらいいのかわかりません。 ご存知の方、この初心者にご教授していただけないでしょうか。  

  • GridViewにバインドせずにデータを表示する方法

    環境:VS2008&VB.NET&ASP GridViewに手動でテーブルからデータを読みデータバインドせず DBの値を表示する方法を考えていますがうまくいかず困っています。 (データバインドしたくない理由はデータバインドを行っていると行の挿入や移動ができない認識のためです。) 初心者のため見当違いなことをしているかもしれませんが それも含めまして質問させていただきます。 質問1 そもそもGridViewでデータバインドせずに手動でデータを表示することは可能でしょうか。 質問2 以下のコードで試しましたが「GridView1.Controls(0).Controls.Add(row1)」でExeptionが発生してしまいました。 手順に不適格な箇所があるのでしょうか。 strSql = "SELECT * FROM Data_Table" Using connection As New SqlClient.SqlConnection(cnStr) Dim command As New SqlClient.SqlCommand(strSql, connection) connection.Open() Dim dr As SqlClient.SqlDataReader = command.ExecuteReader While (dr.Read = True) 'データあり str1 = dr("data1") str2 = dr("data2") str3 = dr("data3") End If connection.Close() Dim item1 As DataGridItem item1 = New DataGridItem(-1, -1, ListItemType.Item) Dim cell0 As TableCell = New TableCell item1.Cells.Add(cell0) Dim cell1 As TableCell = New TableCell item1.Cells.Add(cell1) Dim cell2 As TableCell = New TableCell item1.Cells.Add(cell2) Dim row1 As New GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal) row1.Cells.Add(cell0) row1.Cells.Add(cell1) row1.Cells.Add(cell2) GridView1.Controls(0).Controls.Add(row1) End While End Using エラーの内容 System.ArgumentOutOfRangeException はユーザー コードによってハンドルされませんでした。 Message="指定された引数は、有効な値の範囲内にありません。 パラメータ名: index" お力添えをよろしくお願い致します。

  • VB.NETでSQLを作る時のカンマの対処

    こんにちは。 タイトルの通りなのですが、VB.NETでSQL文を作りたいのですが、カンマの対処について分からなかったので質問させて頂きました。 例えば、下記のようなテーブルとwindowsアプリケーションフォームがあったとします。 itemテーブル                 フォーム(□はチェックボックスだと思ってください。) item_id  item_cd  item_name        □ りんご ---------------------------------       □ ばなな 0001    0001    りんご        □ みかん 0002    0002    ばなな        □ めろん 0003    0003    みかん 0004    0004    めろん このフォームで、チェックボックスに印が付いているものを、SQL文の条件に加えたいと思っていますが、なかなか上手く書けません。 現在のソース sql="SELECT item_id,item_cd,item_name " _   & "FROM item " _   & "WHERE item_name IN (" If apple.checked = True Then   sql &= "'" & label1.text & "'," End If If banana.checked = True Then   sql &= "'" & label2.text & "'," End If         ・         ・         ・ このやり方だと、sql文の最後にカンマが残ってしまいます。 ですが、前カンマをやったところで構文的におかしくなってしまいます。 このようなとき、どのように対処すればよいのでしょうか? よろしければ、教えてください。

  • VB6のコードをVB.NETに移したいのですが

    WEBで見つけたVB6のサンプルコードをVB.NET用に書き直して いるのですが、なんとか波線のエラーはなくなったものの 実行すると、思った結果が得られません。 正しい訂正方法を教えて頂きたいです。 サンプルコードは下記のサイトにありました。 http://vbnet.mvps.org/index.html?code/internet/findfirstcacheentry.htm インターネットキャッシュに関するものです。 文字数の関係で全部は書けないのですが、現在は↓のようになっています。 その他の訂正箇所は 全部のAs Any を As Objectに変更していて、 ComboBoxのアイテムに数値が設定できないようなので、 Select Caseで判断するようにしています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim numEntries As Long Dim cacheType As Long Select Case ComboBox1.SelectedIndex Case Is = 0 cacheType = &H1S Case Is = 1 cacheType = &H8S Case Is = 2 cacheType = &H10S Case Is = 3 cacheType = &H20S Case Is = 4 cacheType = &H40S Case Is = 5 cacheType = &H10000 Case Is = 6 cacheType = &H100000 Case Is = 7 cacheType = &H200000 Case Is = 8 cacheType = URLCACHE_FIND_DEFAULT_FILTER End Select Label1.Text = "Working ..." Label1.Refresh() ListBox1.Items.Clear() ListBox1.Visible = False numEntries = GetCacheURLList(cacheType) ListBox1.Visible = True Label1.Text = VB6.Format(numEntries, "###,###,###,##0") & "files found" End Sub Private Function GetCacheURLList(ByRef cacheType As Long) As Long Dim ICEI As INTERNET_CACHE_ENTRY_INFO Dim hFile As Long Dim cachefile As String Dim nCount As Long Dim dwBuffer As Long Dim pntrICE As Long dwBuffer = 0 hFile = FindFirstUrlCacheEntry(vbNullString, 0, dwBuffer) If (hFile = ERROR_CACHE_FIND_FAIL) And (Err.LastDllError = ERROR_INSUFFICIENT_BUFFER) Then pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) If pntrICE Then CopyMemory(pntrICE, dwBuffer, 4) hFile = FindFirstUrlCacheEntry(vbNullString, pntrICE, dwBuffer) If hFile <> ERROR_CACHE_FIND_FAIL Then Do CopyMemory(ICEI, pntrICE, Len(ICEI)) If (ICEI.CacheEntryType And cacheType) Then cachefile = GetStrFromPtrA(ICEI.lpszSourceUrlName) ListBox1.Items.Add(cachefile) nCount = nCount + 1 End If Call LocalFree(pntrICE) dwBuffer = 0 Call FindNextUrlCacheEntry(hFile, 0, dwBuffer) pntrICE = LocalAlloc(LMEM_FIXED, dwBuffer) CopyMemory(pntrICE, dwBuffer, 4) Loop While FindNextUrlCacheEntry(hFile, pntrICE, dwBuffer) End If End If End If Call LocalFree(pntrICE) Call FindCloseUrlCache(hFile) GetCacheURLList = nCount End Function どうしてもここから分からないので、お助けいただきたいです。 よろしくお願いいたします。

  • データベース内の情報が削除できない

    DataGrid上にボタンを配置してDeleteCommandの実装を試みているのですが、上手くいきません。 ========================= Private Sub DataGrid1_DeleteCommand(ByVal _ source As Object, ByVal e As _ System.Web.UI.WebControls. _ DataGridCommandEventArgs) Handles _ DataGrid1.DeleteCommand Dim PAS As String Dim PIG As Label PIG = CType(e.Item.FindControl("Label1"), Label) If (Not PIG Is Nothing) Then PAS = PIG.Text Dim PAS2 As String = e.Item.Cells(2).Text Dim dr As DataSet1.認証Row dr = DataSet11.認証.Rows.Find("ID") dr.Delete() OleDbDataAdapter1.Update(DataSet11) DataGrid1.DataBind() End If End Sub ========================= これではできないのでしょうか? 教えてください。

  • このロジックの修正点を教えていただけませんか?

    DataGridViewにて、列ごとに入力制御を設けるために作成しました。 DataGridには、ボタンやコンボボックスの列があるため、イベントをとる 列を指定しています。 Private TextEditCtrl As DataGridViewTextBoxEditingControl 'DataGridViewのTextBoxセルを宣言 Private Sub DataGridView1_CellEnter(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles DataGrid.CellEnter Dim columnIndex As Integer = Me.DataGrid.CurrentCell.ColumnIndex Select Case Me.DataGrid.Columns(columnIndex).Name Case "日本語" '日本語入力ONにする列 DataGrid.ImeMode = Windows.Forms.ImeMode.Hiragana Case Else 'IME無効(半角英数のみ) DataGrid.ImeMode = Windows.Forms.ImeMode.Disable End Select End Sub Private Sub DataGrid_EditingControlShowing( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGrid.EditingControlShowing Dim columnIndex As Integer = Me.DataGrid.CurrentCell.ColumnIndex 'テキストボックス列のみ適用 Select Case Me.DataGrid.Columns(columnIndex).Name Case "日本語", "重さ", "数字", "秒" TextEditCtrl = CType(e.Control, DataGridViewTextBoxEditingControl) AddHandler TextEditCtrl.KeyPress, AddressOf TextEditCtrl_KeyPress Case Else End Select End Sub Private Sub TextEditCtrl_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Dim columnIndex As Integer = Me.請求明細DataGridCommon.CurrentCell.ColumnIndex Select Case Me.請求明細DataGridCommon.Columns(columnIndex).Name Case "数字" '数値のみ許可 Select Case e.KeyChar Case Chr(Keys.Back) 'BackSpace Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー Case Else '上記キー以外は処理しないようにする e.Handled = True End Select Case "重さ" '数値とマイナスを許可 Select Case e.KeyChar Case Chr(Keys.Back) 'BackSpace Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー 'Case Chr(Keys.NumPad0) To Chr(Keys.NumPad9) Case "-"c Case Else '上記キー以外は処理しないようにする e.Handled = True End Select Case "秒" '数値と小数点を許可 Select Case e.KeyChar Case Chr(Keys.Back) 'BackSpace Case Chr(Keys.D0) To Chr(Keys.D9) '数値キー Case Chr(Keys.Decimal) Case Chr(Keys.Oemcomma) Case Chr(Keys.OemPeriod) Case "."c Case Else '上記キー以外は処理しないようにする e.Handled = True End Select End Select End Sub 最後に、CellEndEditイベントにて、RemoveHandler TextEditCtrl.KeyPress, AddressOf TextEditCtrl_KeyPress、 (これもテキストボックス列のみを指定)で終わりです。 このロジックの影響か定かではないのですが、空白が入力できない行や、確定できない コンボボックスなどが出来てしまい、困っています。 もし修正箇所ありましたら、アドバイスお願いします。

  • VB2010 DataGridからmdb更新

    以下のプログラムであるフォーム上のDataGridViewにmdbファイルから 読み込んだ値をDataGrid上で編集して更新ボタン(Button_UpD)クリックで mdbの中身を更新させたいです。 メモリ上(?)では書き換わるのですがmdbの更新にはなっていません。 検索したところBuilderを使うようなやり方も書いていてためしましたが うまくいきません。 ご教授下さい。   '更新ボタンをクリック Private Sub Button_UpD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_UpD.Click Dim Answer As Long Answer = MsgBox("更新を保存しますか?", vbYesNoCancel, "保存確認") Select Answer Case vbYes Dim ConectString As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath Dim Cn As New OleDbConnection(ConectString) Dim SQLCm As OleDbCommand = Cn.CreateCommand Adapter = New OleDbDataAdapter(SQLCm) Dim dRow As DataRow Dim dTable As DataTable Dim i As Integer dTable = CType(DataGridView2.DataSource, DataTable) For Each dRow In dTable.Rows '変更された場合(Modified) If dRow.RowState = DataRowState.Modified Then '一度に編集状態をコミット dRow.AcceptChanges() End If Next For i = 0 To dTable.Rows.Count - 1 Debug.WriteLine(i.ToString() & ControlChars.Tab _ & dTable.Rows(i).RowState.ToString()) Next Setting.Close() Setting.Show() Me.Close() End Select End Sub

  • Excelで入力日の自動入力日を格納するには

    入力日を自動入力して、その日付を格納します。 さらに、隣のセルにコピーして入力日で並べ替えをしたいのですが 並べ替えが出来ません。 (1)A2~A10に何か入力したら、B列に入力日を返します。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer 'r 行番号 'C 列番号 r = Target.Row c = Target.Column If c <> 1 Or r < 2 Or r > 10 Then End If Cells(r, c) <> "" Then Cells(r, c + 1) = Format(Now, "yyyy/m/d") Else Cells(r, c + 1) = "" End If End Sub   上記で、入力日を格納するところまでは出来ました。 (2)続いてマクロ【並べ替え】で、A2-B10をコピーし、E2へ貼り付け、 日付降順で並べ替えをします。 Sub 並べ替え() Range("A2:B10").Select Selection.Copy Range("E2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Columns("E:F").Select Selection.Sort Key1:=Range("F2"), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin, DataOption1:=xlSortNormal Range("F2").Select End Sub (3)上記マクロをコマンドボタンに貼り付けましたが、  貼り付けまではいきましたが、並べ替えができませんでした。 コードで並べ替え制限などかかってるのでしょうか?? よろしくお願い致します。

  • excel正しくリンク貼り付けができません

    Windows10,microsoft365使用の超初心者です。 シート集計を表1、ひょう2にリンク貼り付けするため 次のコードを実行したところ、表2を見ると E40:AI73でなく、E6:AI39がリンク貼り付けされています。 原因がわかりません。困ってます。よろしくお願いいたします。 Sub 表1にリンク貼り付け() Dim my_cell Dim i Worksheets("集計").Activate Range("E6:AI39").Select i = 1 For Each my_cell In Selection Worksheets("表1").Cells(i, 1).Value = "=集計!" & my_cell.Address i = i + 1 Next my_cell End Sub Sub 表2にリンク貼り付け() Dim my_cell Dim i Worksheets("集計").Activate Range("E40:AI73").Select i = 1 For Each my_cell In Selection Worksheets("表2").Cells(i, 1).Value = "=集計!" & my_cell.Address i = i + 1 Next my_cell End Sub