2010/09/28(Tue) 00:14:11 編集(投稿者)
■No53810 (まさひろ さん) に返信
> もりおさんに教えていただいた解析方法で確認したところ、ListView1.EditItemが
> Nothingになっていました。
> ということは編集ボタンを押した段階ではEditItemTemplateのテキストボックスは
> まだ作成されていないという認識でよろしいでしょうか?
Button.Click イベントの段階において EditItemTemplate の TextBox は作成されて
いない、という部分は合っています。
ListView.EditItem プロパティが Nothing であること。
EditItemTemplate の TextBox が作成されていないこと。
2つの間には、実は、あまり関係がなかったりします。
ListView.EditItem プロパティは ListView.Items(ListView.EditIndex) の値を返し
ます。 ListView.EditIndex に値をセットすることで参照可能になります。
ListView の編集ボタンを押下した場合、ListView.EditIndex に値のセットされる
タイミングは ListView.ItemEditing イベントが発生した後です。
よって、ListView.EditItem プロパティは ListView.ItemEditing イベント発生後で
あれば参照可能です。
> また、その場合、テキストボックスが作成された後というのはイベントかなにかで
> 拾えるものなのでしょうか?
ItemCreated イベントが、行といいますか Item が作成されると、発生します。
編集ボタンを押下した行の ItemCreated イベント以降であれば、TextBox を取得す
ることができるはずです。
たとえば、ItemCreated イベントのハンドラーにおいて取得するならばこんな感じです。
Private Sub ListView1_ItemCreated( _
ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs) Handles ListView1.ItemCreated
If DirectCast(e.Item, ListViewDataItem).DisplayIndex = ListView1.EditIndex Then
Dim txtNAME As TextBox = DirectCast(e.Item.FindControl("txtNAME"), TextBox)
Debug.Assert(txtNAME IsNot Nothing, "ぬるぽ")
End If
End Sub
PreRender イベントのハンドラーにおいて取得するならばこんな感じです。
Private Sub ListView1_PreRender( _
ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ListView1.PreRender
If ListView1.EditItem IsNot Nothing Then
Dim txtNAME As TextBox = DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox)
Debug.Assert(txtNAME IsNot Nothing, "ぬるぽ")
End If
End Sub
編集ボタン押下時のイベントの発生順について。
ListView 内に配置した Button のイベントは上位のコントロールにイベントを転送
するバブルイベントになります。
編集ボタンを押下すると Button.Click イベントが発生します。イベントは親の
コントロールに伝わっていき、ListView.ItemEditing イベントが発生します。
このような順番で発生します。
Button.Click
Button.Command
ListView.ItemCommand
ListView.ItemEditing
ListView.DataBinding
ListView.ItemCreated
ListView.ItemDataBound
...
ところで、色を動的に変える必要がないようであれば。
aspx に静的に記述しておくという手もあります。
<EditItemTemplate>
...
<asp:TextBox ID="txtNAME" runat="server" Text='<%# Bind("name") %>' BackColor="Red" />