C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: TemplateFieldの特定単語を強調表示したい


(過去ログ 76 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■44597 / inTopicNo.1)  TemplateFieldの特定単語を強調表示したい
  
□投稿者/ サトシ (42回)-(2009/12/13(Sun) 16:06:06)

分類:[ASP.NET (VB)] 

いつもお世話になってます。
以前、TemplateFieldの特定の単語を強調表示したい件でお世話になった
http://bbs.wankuma.com/index.cgi?mode=all&namber=44353
の続きの質問です。

GridViewのTemplateFieldの特定の単語を強調表示するのに、多数のTemplateField列へ
対応するコードの書き方がわからなくて困っております。
以下の様なテストDBを作りました。
|ID|名前Template|年齢Template|子供名Template|
| 1|鈴木一郎  |35     |太郎     |
| 2|鈴木次郎  |55     |一郎     |
| 3|田中一郎  |43     |花子     |
| 4|田中三郎  |37     |一郎     |

複数のTemplateFieldがあり、GridViewではItemTemplateはLabel1, Label2, Label3で情報
が表示されています。
このデータをGridViewで表示し、中の「一郎」だけを強調表示する以下のコードを書きました。
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        If e.Row.RowIndex = Me.GridView1.EditIndex Then Return
        For i As Integer = 1 To e.Row.Cells.Count - 1
            Dim dumLabel As Label = e.Row.FindControl("Label" & Asc(i))
            dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
        Next
    End If
End Sub

しかし、
dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
の行で、「NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。」
のエラーが発生し動きません。
どのあたりに原因があり、解決はどの様に考えればよいでしょうか?よろしくお願いします。

VWD2008, MS Access2003です。

引用返信 編集キー/
■44598 / inTopicNo.2)  Re[1]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (131回)-(2009/12/13(Sun) 16:41:56)
2009/12/13(Sun) 16:54:39 編集(投稿者)
2009/12/13(Sun) 16:45:50 編集(投稿者)
2009/12/13(Sun) 16:45:05 編集(投稿者)

No44597 (サトシ さん) に返信
> いつもお世話になってます。
> 以前、TemplateFieldの特定の単語を強調表示したい件でお世話になった
> http://bbs.wankuma.com/index.cgi?mode=all&namber=44353
> の続きの質問です。
>
> GridViewのTemplateFieldの特定の単語を強調表示するのに、多数のTemplateField列へ
> 対応するコードの書き方がわからなくて困っております。
> 以下の様なテストDBを作りました。
> |ID|名前Template|年齢Template|子供名Template|
> | 1|鈴木一郎  |35     |太郎     |
> | 2|鈴木次郎  |55     |一郎     |
> | 3|田中一郎  |43     |花子     |
> | 4|田中三郎  |37     |一郎     |
>
> 複数のTemplateFieldがあり、GridViewではItemTemplateはLabel1, Label2, Label3で情報
> が表示されています。
> このデータをGridViewで表示し、中の「一郎」だけを強調表示する以下のコードを書きました。
> Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
> If e.Row.RowType = DataControlRowType.DataRow Then
> If e.Row.RowIndex = Me.GridView1.EditIndex Then Return
> For i As Integer = 1 To e.Row.Cells.Count - 1
> Dim dumLabel As Label = e.Row.FindControl("Label" & Asc(i))
> dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
> Next
> End If
> End Sub
>
> しかし、
> dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
> の行で、「NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
> オブジェクト参照がオブジェクト インスタンスに設定されていません。」
> のエラーが発生し動きません。
> どのあたりに原因があり、解決はどの様に考えればよいでしょうか?よろしくお願いします。
>
> VWD2008, MS Access2003です。

Asc関数は引数で渡された文字(Char型、String型を渡した場合は先頭の文字)のアスキーコード(数値)を取得する関数。
つまり、"a"を渡したら97、"1"を渡したら49を返す。
数値型を渡した場合は暗黙的にString型に変換され渡されるから、
For i As Integer = 0 To 99
e.Row.FindControl("Label" & Asc(i))
Next
とした場合、"Label48"から"Label57"を(10回)検索することになる。

単に
e.Row.FindControl("Label" & i)
でOK
引用返信 編集キー/
■44600 / inTopicNo.3)  Re[2]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (43回)-(2009/12/13(Sun) 17:02:00)
No44598 (gtk2k さん) に返信
> Asc関数は引数で渡された文字(Char型、String型を渡した場合は先頭の文字)のアスキーコード(数値)を取得する関数。
> つまり、"a"を渡したら97、"1"を渡したら49を返す。
> 数値型を渡した場合は暗黙的にString型に変換され渡されるから、
> For i As Integer = 0 To 99
> e.Row.FindControl("Label" & Asc(i))
> Next
> とした場合、"Label48"から"Label57"を(10回)検索することになる。
> 
> 単に
> e.Row.FindControl("Label" & i)
> でOK

gtk2kさん、いつも早急なアドバイスありがとうございます。
早速
Dim dumLabel As Label = e.Row.FindControl("Label" & i)
に修正し動かしてみましたが、残念ながら
dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
の行で、「NullReferenceExceptionはユーザーコードによってハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。」
のエラーが発生し動きませんでした。
次に確認してみる事項はどのあたりになりますでしょうか?アドバイス頂けると助かります。

引用返信 編集キー/
■44601 / inTopicNo.4)  Re[3]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (132回)-(2009/12/13(Sun) 17:15:16)
e.Row.Cells.Count - 1
というのでループしているのがまずいんでは?
Label1〜Label[e.Row.Cells.Count - 1]
というコントロールが歯抜けなしにある?
引用返信 編集キー/
■44602 / inTopicNo.5)  Re[4]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (44回)-(2009/12/13(Sun) 17:24:25)
No44601 (gtk2k さん) に返信
> e.Row.Cells.Count - 1
> というのでループしているのがまずいんでは?
> Label1〜Label[e.Row.Cells.Count - 1]
> というコントロールが歯抜けなしにある?

はい、現在のテストプログラムではLabel1, Label2, Label3の3つが歯抜けなしに存在してます。
引用返信 編集キー/
■44604 / inTopicNo.6)  Re[5]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (133回)-(2009/12/13(Sun) 17:49:42)
No44602 (サトシ さん) に返信
> ■No44601 (gtk2k さん) に返信
>>e.Row.Cells.Count - 1
>>というのでループしているのがまずいんでは?
>>Label1〜Label[e.Row.Cells.Count - 1]
>>というコントロールが歯抜けなしにある?
>
> はい、現在のテストプログラムではLabel1, Label2, Label3の3つが歯抜けなしに存在してます。

Dim dumLabel As Label = e.Row.FindControl("Label" & i)
の次の行に
If dumLabel Is Nothing Then
Console.WriteLine(i)
End If
の3行を追加し、
Console.WriteLine(i)
の行にブレークポイントを設定してデバッグ実行し、とまったときのiの値はなんになってるのか?
引用返信 編集キー/
■44607 / inTopicNo.7)  Re[6]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (45回)-(2009/12/13(Sun) 18:08:31)
No44604 (gtk2k さん) に返信
> Dim dumLabel As Label = e.Row.FindControl("Label" & i)
> の次の行に
> If dumLabel Is Nothing Then
>    Console.WriteLine(i)
> End If
> の3行を追加し、
> Console.WriteLine(i)
> の行にブレークポイントを設定してデバッグ実行し、とまったときのiの値はなんになってるのか?

iの値は「4」を示しました。
私は「1」と思ってましたが、4でした。このあたりに解決のヒントが。
私なりに考えてみたのですが・・・(スキル不足だなあ・・・)

引用返信 編集キー/
■44608 / inTopicNo.8)  Re[7]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (46回)-(2009/12/13(Sun) 18:46:00)
gtk2kさん、自己解決しましたので報告します。
For i As Integer = 1 To e.Row.Cells.Count - 2
に変更したところ、エラーの発生がなくなり、4つの「一郎」が強調表示され表示されま
した。ありがとうございました。

↓正常に動いたコード
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        If e.Row.RowIndex = Me.GridView1.EditIndex Then Return
        For i As Integer = 1 To e.Row.Cells.Count - 2
            Dim dumLabel As Label = e.Row.FindControl("Label" & i)
            dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")        Next
    End If
End Sub

解決済み
引用返信 編集キー/
■44609 / inTopicNo.9)  Re[5]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (134回)-(2009/12/13(Sun) 18:46:50)
2009/12/13(Sun) 18:59:16 編集(投稿者)
2009/12/13(Sun) 18:56:46 編集(投稿者)
2009/12/13(Sun) 18:55:39 編集(投稿者)
2009/12/13(Sun) 18:53:52 編集(投稿者)


e.Row.Cells.Countは、行にあるすべてのセルの数を返す。
(普通はすべての列の数と等しいが、カスタマイズしている場合はその限りではない)
データ表示列以外の編集ボタンや選択ボタンを表示する列、また非表示にしている列も含まれる。
なので、データを表示するセル以外にその行にその他の列が含まれている場合、
e.Row.Cells.Countはその分多い数を返す。
なので、e.Row.Cells.Countでのループは本来不適切なものとなる。
(なぜe.Row.Cells.Count - 1としていたのか理由はわからんが)

データ列数でループを行う場合は
For i As Integer = 1 To CType(GridView1.DataSource, DataTable).Columns.Count
Next
というように、DataSourceにバインドしたDataTableの列数でループするほうがいい。
(ただし、場合によってはこれでもだめな場合が出てくる)

CType(GridView1.DataSource, DataTable).Columns.Countでループを行い
(e.Row.Cells.Countでループしてもかまわん)
かつ、
Dim dumLabel As Label = e.Row.FindControl("Label" & i)
If dumLabel IsNot Nothing Then
dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
End If
と、FindControlで取得した結果がNothingではない場合に強調表示処理を行うようにしたほうがよい。
解決済み
引用返信 編集キー/
■44611 / inTopicNo.10)  Re[6]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (47回)-(2009/12/13(Sun) 19:42:55)
No44609 (gtk2k さん) に返信
gtk2kさん、アドバイスありがとうございます。

> (なぜe.Row.Cells.Count - 1としていたのか理由はわからんが)
GridViewの列の数を取得する方法をこれしか知らないので、これを使ってます。

> データ列数でループを行う場合は
> For i As Integer = 1 To CType(GridView1.DataSource, DataTable).Columns.Count
> Next
> というように、DataSourceにバインドしたDataTableの列数でループするほうがいい。
GridViewの表示列の数をこの方法で取得する方法に変更したいのですが、DataTableの所
が波線になりうまく行きません。
DataGridでもダメだし、DataListでもダメでした。
DBにMS Accessを利用し、AccessDataSource1を利用しているのですが、そのあたりが
ことなるのでしょうか?アドバイス頂けると助かります。

引用返信 編集キー/
■44612 / inTopicNo.11)  Re[7]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (135回)-(2009/12/13(Sun) 20:35:42)
No44611 (サトシ さん) に返信
> ■No44609 (gtk2k さん) に返信
> gtk2kさん、アドバイスありがとうございます。
>
>>(なぜe.Row.Cells.Count - 1としていたのか理由はわからんが)
> GridViewの列の数を取得する方法をこれしか知らないので、これを使ってます。
>
>>データ列数でループを行う場合は
>>For i As Integer = 1 To CType(GridView1.DataSource, DataTable).Columns.Count
>>Next
>>というように、DataSourceにバインドしたDataTableの列数でループするほうがいい。
> GridViewの表示列の数をこの方法で取得する方法に変更したいのですが、DataTableの所
> が波線になりうまく行きません。
> DataGridでもダメだし、DataListでもダメでした。
> DBにMS Accessを利用し、AccessDataSource1を利用しているのですが、そのあたりが
> ことなるのでしょうか?アドバイス頂けると助かります。

例が悪かった、これはDataTableオブジェクトをDataSourceに設定している場合はこれでいけるのだが
SqlDataSourceやAccessDataSourceを使ってデータを取得している場合はできない。

CType(e.Row.DataItem, DataRowView).Row.Table.Columns.Count

でやってみてほしい。
引用返信 編集キー/
■44613 / inTopicNo.12)  Re[8]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (48回)-(2009/12/13(Sun) 22:05:46)
No44612 (gtk2k さん) に返信
> 例が悪かった、これはDataTableオブジェクトをDataSourceに設定している場合はこれでいけるのだが
> SqlDataSourceやAccessDataSourceを使ってデータを取得している場合はできない。
> 
> CType(e.Row.DataItem, DataRowView).Row.Table.Columns.Count
> 
> でやってみてほしい。

gtk2kさん、アドバイスありがとうございます。
VWD2008のインテリセンスでCType(e.Row.DataItem, DataRowView が出てこないですし
DataRowView部に波線が表示されるので、インテリセンスが表示してくれる
CType(e.Row.DataItem, Data.DataRow).Table.Columns.Count
にしてみましたが
CType(e.Row.DataItem, Data.DataRow).Table.Columns.Count
の行で、「型 'System.Data.DataRowView' のオブジェクトを型 'System.Data.DataRow'
 にキャストできません。」のエラーが表示され動きません。
ASP.NETを動かすには、多くの知識を必要としますね。アドバイス頂けると助かります。

引用返信 編集キー/
■44615 / inTopicNo.13)  Re[9]: TemplateFieldの特定単語を強調表示したい
□投稿者/ gtk2k (136回)-(2009/12/14(Mon) 00:17:54)
No44613 (サトシ さん) に返信
> ■No44612 (gtk2k さん) に返信
>>例が悪かった、これはDataTableオブジェクトをDataSourceに設定している場合はこれでいけるのだが
>>SqlDataSourceやAccessDataSourceを使ってデータを取得している場合はできない。
>>
>>CType(e.Row.DataItem, DataRowView).Row.Table.Columns.Count
>>
>>でやってみてほしい。
>
> gtk2kさん、アドバイスありがとうございます。
> VWD2008のインテリセンスでCType(e.Row.DataItem, DataRowView が出てこないですし
> DataRowView部に波線が表示されるので、インテリセンスが表示してくれる
> CType(e.Row.DataItem, Data.DataRow).Table.Columns.Count
> にしてみましたが
> CType(e.Row.DataItem, Data.DataRow).Table.Columns.Count
> の行で、「型 'System.Data.DataRowView' のオブジェクトを型 'System.Data.DataRow'
> にキャストできません。」のエラーが表示され動きません。
> ASP.NETを動かすには、多くの知識を必要としますね。アドバイス頂けると助かります。
その行にブレークポイントを設定し、e.Row.DataItemの内部の型なんであるかを見てみないとわからん
引用返信 編集キー/
■44650 / inTopicNo.14)  Re[10]: TemplateFieldの特定単語を強調表示したい
□投稿者/ サトシ (49回)-(2009/12/14(Mon) 22:11:41)
2009/12/14(Mon) 22:14:10 編集(投稿者)
No44615 (gtk2k さん) に返信
> その行にブレークポイントを設定し、e.Row.DataItemの内部の型なんであるかを見てみないとわからん

gtk2kさん、For i As Integer = 1 To CType(e.Row.DataItem, Data.DataRowView).Row.Table.Columns.Count - 1
で、GridViewの列数が取得でき、4つの「一郎」が強調表示されるようになりましたので
報告します。ありがとうございました。
インテリセンスで「すべての候補」を選択することで「DataRowView」が表示されました。
以下、正しく動いたコードです。
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        If e.Row.RowIndex = Me.GridView1.EditIndex Then Return
        'For i As Integer = 1 To e.Row.Cells.Count - 2
        For i As Integer = 1 To CType(e.Row.DataItem, Data.DataRowView).Row.Table.Columns.Count - 1
            Dim dumLabel As Label = e.Row.FindControl("Label" & i)
            dumLabel.Text = dumLabel.Text.Replace("一郎", "<B Style='background-color:#fff495'>一郎</B>")
        Next
    End If
End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -