- PR -

DataBind後のGridViewのプロパティ編集ができない

投稿者投稿内容
ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-03-12 00:49
ASP.NET + AJAX で開発しております。

GRIDVIEWのDATABIND (GRID表示はできている)後の
GRIDVIEW プロパティの調整ができなくて困っております。

具体的にはPAGELOAD イベントで、DATABINDを行い、
PRERENDARイベントか、ROWCREATEDイベントで、GRIDVIEWの
プロパティを操作しようと考えております。
すべて、サーバースクリプトで行い、ウィザード等は使用
しません。

VB側の大体のソースですが、

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


Dim taAdapter_new As ストアドTableAdapter = _

New ストアドTableAdapter



Dim dtTable As DataTable = Nothing



Dim dtTB2_new As ストアドDataTable = New ストアドDataTable



dtTB2_new _

= taAdapter_new.GetData(11).Copy()

INFORMATION_FIRST.Text = Year(dtTB2_new.Rows(0).Item(1)).ToString + "/" + _

Month(dtTB2_new.Rows(0).Item(1)).ToString + "/" + _

Day(dtTB2_new.Rows(0).Item(1)).ToString + _

": " + dtTB2_new.Rows(0).Item(2).ToString





'履歴表示

Dim strAllInfo As String = ""

Dim intInfoCount As Integer = 0

Dim dt As New DataTable

dt.Columns.Add(New DataColumn())

For intInfoCount = 1 To dtTB2_new.Count - 1



strAllInfo = Year(dtTB2_new.Rows(intInfoCount).Item(1)).ToString + "/" + _

Month(dtTB2_new.Rows(intInfoCount).Item(1)).ToString + "/" + _

Day(dtTB2_new.Rows(intInfoCount).Item(1)).ToString + _

": " + dtTB2_new.Rows(intInfoCount).Item(2).ToString

ListBox1.Items.Add(New ListItem(strAllInfo, intInfoCount))



Dim row1 As GridViewRow = New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)

Dim cell1 As TableCell = New TableCell()





cell1.ColumnSpan = 1

cell1.RowSpan = 1

cell1.Text = strAllInfo

'row1.Cells.Add(cell1)

row1.Controls.Add(cell1)



dt.Rows.Add(row1.Cells.Item(0).Text)


'このような形でGridViewに直接追加したかったが、うまくいかないので、
' DataBINDに切り替えた。

'GridView1.Controls(0).Controls.AddAt(GridView1.Rows.Count + 1, row1)

'ここまでがうまくいかない
Next

'INFORMATION_ALL = dtTB2.Rows(0).Item(1).ToString

GridView1.DataSource = dt

GridView1.DataBind()
'BINDしたデータテーブルの内容はGRIDVIEWに表示される。

 ’うまくいかない
GridView1.EnableViewState = False
 ’うまくいかない
GridView1.CssClass = "LoginBorder"
 ’うまくいかない
GridView1.CaptionAlign = TableCaptionAlign.Left



End Sub



Protected Sub GridView1_PreRendar(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.PreRender

 ’うまくいかない
GridView1.EnableViewState = False
 ’うまくいかない
GridView1.CssClass = "LoginBorder"
 ’うまくいかない
GridView1.CaptionAlign = TableCaptionAlign.Left

End Sub

残念ながら
GridView1_PreRendar
イベントでGridViewのプロパティーをいじっても、まったく無視されます。

となると、GRIDVIEWの描画自体が、PreRENDAR後に行われているという事
なのでしょうか………。

どなたか、ご存知でしたら、ご教授願いたいのですが。。。
よろしくお願いいたします。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-03-12 22:28
投稿文を読んでいる人が困るのは、どうなるのか想像もできない投稿です。
「うまくいかない」とは書いてあるのですが、どのような状態を「うまくいかない」と表現されているのでしょう?

たとえば、GridView1 の CssClass を設定されていますが、クライアントに出力される GridView (確か、table 要素だったと思います)に、class 属性が追加されていないということでしょうか?
ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-03-13 01:14
>Jitta様
わかりにくくて申し訳ありません。
クライアントに出力される、GridViewにclass属性が追加されないのです。
また、他のGridViewに対するプロパティの操作も、DataBind後だと、
効かないようです。
DataBindを使わない、GridViewの描画、データ操作をしたほうがよろしいのかも
しれません。
PreRendarイベント時に、データバインドのデータ等がバインドされると
いうのを前に見た事があるのですが、PreRendarComplete タイミングで、
GridViewのスタイルを変化させようとしても、できなかったので、
原因を知りたかったのです。

むしろ、DataBindを使った場合で、GridViewのスタイルをサーバースクリプト
で実現させられる場合のソースを見てみたい、という気持ちもあります。
ちょっと、まだ、GridViewについて、分からない事が多く、経験不足で
申し訳ありません。

参照URLとして、自分が他サイトで、たてたGridViewのヘッダースレッド
があるのですが、

http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/edb4cb97-9b30-4f74-8144-6ae640ba7128/

何らかのヒントを自分なりに探して、試してはいるのですが…。

EnableViewState = false  updateパネルなども、アップデート状態は
場合に応じてという形にしております。
それで、GridViewデータの更新等は問題なくできております。


http://social.msdn.microsoft.com/forums/ja-JP/vsgeneralja/thread/fd058882-c73b-4910-9244-ad0c5486ade8/#page:2

こちらも参照しました。

[ メッセージ編集済み 編集者: ニセイタ 編集日時 2009-03-13 01:24 ]

[ メッセージ編集済み 編集者: ニセイタ 編集日時 2009-03-13 01:27 ]
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2009-03-13 06:12
以下のサイトが参考になるかと・・・

http://msdn.microsoft.com/ja-jp/library/ms178472(VS.80).aspx
http://msdn.microsoft.com/en-us/library/ms178472.aspx#databindingevents

http://resources.esri.com/help/9.3/arcgisserver/adf/dotnet/developer/ADF/graphics/page_lifecycle.png
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-03-13 07:39
では、DataBind メソッドの前に書くと、期待どおりになるのでしょうか?

最初に書かれている内容では、DataBind とプロパティ設定の順番が問題だと理解されますが、本当にそうなのでしょうか?そうであるなら、順番をかえておけばいいと思うのですが、そうされていないのは、何故でしょう?
ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-03-14 03:47
>Access様
ありがとうございます。
大変参考になります。
http://msdn.microsoft.com/en-us/library/ms178472.aspx#databindingevents

PreRender
Each data bound control whose DataSourceID property is set calls its DataBind method. For more information, see Data Binding Events for Data-Bound Controls later in this topic.
ここに、バインドコントロールのデータソースIDプロパティがそのデータバインドメソッドでセットされると書いてありますね。

DataBinding のイベント説明で
This event is raised by data-bound controls before the PreRender event of the containing control (or of the Page object) and marks the beginning of binding the control to the data.

PreRenderイベントの前にデータバインディングが行われているという事ですかね。

RowCreated (GridView only) or ItemCreated のイベント説明で
Use this event to manipulate content that is not dependent on data binding. For example, at run time, you might programmatically add formatting to a header or footer row in a GridView control.
データバインドによらない場合は、このイベントで、ヘッダーや、フッターに対する
操作を加えようと書いてありますかね。

RowDataBound (GridView only) or ItemDataBound のイベント説明で、
直接データを見たり、変更ができると書いてあります。

DataBound
This event marks the end of data-binding operations in a data-bound control. In a GridView control, data binding is complete for all rows and any child controls.
ここでは、データバインディングが終了すると書いてありますかね


SaveStateComplete
PreRenderイベントの後にSaveStateComplete があり、VIewStateが保存される。
と書いてありますね。これは、ViewStateの保存がTrueになっている時に
発生という認識でいいのですかね。

ちょっと、GridViewのスタイルをどこで設定するかという記述は分かりません
でしたが、コントロールが、作成されるのが、Rendarイベントだとすると、
そのタイミングは、Rendarイベントの前である必要があるという事になります
よね。

自分の認識で間違っていないでしょうか。
貴重な情報ありがとうございました。







ニセイタ
常連さん
会議室デビュー日: 2009/02/27
投稿数: 24
投稿日時: 2009-03-14 03:58
>Jitta様
ご返信ありがとうございます。

引用:

では、DataBind メソッドの前に書くと、期待どおりになるのでしょうか?
最初に書かれている内容では、DataBind とプロパティ設定の順番が問題だと理解されますが、本当にそうなのでしょうか?そうであるなら、順番をかえておけばいいと思うのですが、そうされていないのは、何故でしょう?



期待通りには、なっておりません。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.aspx
ここをチェックしてみると、ちょっと、自分の命令文が間違っていたのかもしれない
という気もしてきました。
RowStyle 等のスタイルの設定を、プログラム上で変更してみて、再度挑戦して
みようかと思っております。

以前ヘッダーを2行にする操作を、データバインドを行う前に、作成した事
があるのですが、データバインドをヘッダー2行にしたGridViewに対して
行っても、データバインド後は、自分の作成した、ヘッダー2行は無視されて、
1行のヘッダーと、データ部という構成になりましたので、順番が
重要なのかと考えておりましたが、スタイルの設定を、まず、確認してから、
再度、順番については考えて見ます。

ご指導ありがとうございます。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2009-03-15 07:30
以下のスレッドを読んでみてください。

ページライフサイクルがよく分かります。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=36752&forum=7&start=0

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集

スキルアップ/キャリアアップ(JOB@IT)