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

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

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

Re[7]: Listviewの編集ボタン押下時処理


(過去ログ 90 を表示中)

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

■53692 / inTopicNo.1)  Listviewの編集ボタン押下時処理
  
□投稿者/ まさひろ (44回)-(2010/09/24(Fri) 10:54:53)

分類:[.NET 全般] 

いつもお世話になります。まさひろです。

ASP.NET3.5(VWD2008)、ORACLE11で勉強をしています。
また分からないことがあり、ご教授頂きたく書き込ませていただきました。

Listviewで登録、編集、削除機能を作成しています。
一覧で、行ごとに削除、編集ボタン、そして、一番下に登録ボタンがあります。

編集ボタンを押下したときに、編集行の項目がテキスト行になるのですが、
そのタイミングでテキストボックスのバックカラーを変更したいと思っています。

以下の方法で行おうとしています。

aspx側(ItemTemplate、AlternatingItemTemplate、SelectedItemTemplateにて記述)

<asp:Button ID="btnEdit" runat="server" CommandName="Edit" Text="編集" OnClick="btnEdit_Click" />

aspx.vb側

Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs)

	DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red
End Sub

しかし、実行すると、
DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red
で、「オブジェクト参照がオブジェクトインスタンスに設定されていませんん」と言うエラーが
出てしまいます。
編集ボタンを押下したときにテキストボックスのバックカラーを変更するにはどのようにすれば
良いのでしょうか?
ご教授お願いします。

引用返信 編集キー/
■53696 / inTopicNo.2)  Re[1]: Listviewの編集ボタン押下時処理
□投稿者/ PATIO (10回)-(2010/09/24(Fri) 11:13:40)
No53692 (まさひろ さん) に返信
> aspx.vb側
>
> Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
>
> DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red
> End Sub
>
> しかし、実行すると、
> DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red
> で、「オブジェクト参照がオブジェクトインスタンスに設定されていませんん」と言うエラーが
> 出てしまいます。
> 編集ボタンを押下したときにテキストボックスのバックカラーを変更するにはどのようにすれば
> 良いのでしょうか?

エラーの内容に関してもう少し突き詰めてみませんか。
まさひろさん自身はどの部分が一番怪しいと思います?
で、そこがうまく行っていないとしてなぜうまく行かないんでしょう?

引用返信 編集キー/
■53779 / inTopicNo.3)  Re[2]: Listviewの編集ボタン押下時処理
□投稿者/ マサヤ (155回)-(2010/09/27(Mon) 10:00:51)
txtNAMEというプロパティ名のコントロールがないのではないですか?
引用返信 編集キー/
■53790 / inTopicNo.4)  Re[3]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ (45回)-(2010/09/27(Mon) 13:51:45)
PATIOさん、マサヤさんありがとうございます。


> txtNAMEというプロパティ名のコントロールがないのではないですか?

aspx側(ItemTemplate、AlternatingItemTemplate、SelectedItemTemplateにて記述)で
記述していていることを確認しました。

btnEdit_Clickのイベントの時点ではまだテキストボックスのオブジェクトが作成されていない
と言う事でしょうか・・・・?
引用返信 編集キー/
■53802 / inTopicNo.5)  Re[4]: Listviewの編集ボタン押下時処理
□投稿者/ もりお (285回)-(2010/09/27(Mon) 16:26:59)
No53790 (まさひろ さん) に返信

> > txtNAMEというプロパティ名のコントロールがないのではないですか?
> 
> aspx側(ItemTemplate、AlternatingItemTemplate、SelectedItemTemplateにて記述)で
> 記述していていることを確認しました。

コードを拝見する限りではコントロール txtNAME が EditItemTemplate に記述されていることを確認す
べきでないでしょうか。

> btnEdit_Clickのイベントの時点ではまだテキストボックスのオブジェクトが作成されていない
> と言う事でしょうか・・・・?

エラーの原因がコントロール txtNAME を参照できないことであるならば、TextBox の作成される
タイミングは検討するべき事柄のように思います。

その前に、エラーの原因を絞り込んでみてはいかがでしょうか。
「オブジェクト参照がオブジェクトインスタンスに設定されていません」
というエラーメッセージは、いずれかのオブジェクトが Nothing ですよーという意味です。

DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red

このコードにおいて、エラーの原因となりうるオブジェクトは以下のものです。

ListView1
ListView1.EditItem
ListView1.EditItem.FindControl("txtNAME")

こんな感じで、1つずつ確認してみてはいかがでしょうか。

Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
  If ListView1 Is Nothing Then
    Debug.WriteLine("ListView1 は Nothing")
  Else
    Debug.WriteLine("ListView1 は Not Nothing")
  End If
  
  If ListView1.EditItem Is Nothing Then
    Debug.WriteLine("ListView1.EditItem は Nothing")
  Else
    Debug.WriteLine("ListView1.EditItem は Not Nothing")
  End If
  
  If ListView1.EditItem.FindControl("txtNAME") Is Nothing Then
    ...
  

引用返信 編集キー/
■53810 / inTopicNo.6)  Re[5]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ (46回)-(2010/09/27(Mon) 17:44:04)
もりおさん、いつもいつもありがとうございます。

>
>>> txtNAMEというプロパティ名のコントロールがないのではないですか?
>>
>>aspx側(ItemTemplate、AlternatingItemTemplate、SelectedItemTemplateにて記述)で
>>記述していていることを確認しました。
>
> コードを拝見する限りではコントロール txtNAME が EditItemTemplate に記述されていることを確認す
> べきでないでしょうか。
>


すみません。ItemTemplate、AlternatingItemTemplate、SelectedItemTemplateでは
<asp:Button ID="btnEdit" runat="server" CommandName="Edit" Text="編集" OnClick="btnEdit_Click" />、
EditItemTemplateではtxtNAMEのコントロールが記述されていることを確認しました。


> エラーの原因がコントロール txtNAME を参照できないことであるならば、TextBox の作成される
> タイミングは検討するべき事柄のように思います。
>
> その前に、エラーの原因を絞り込んでみてはいかがでしょうか。
> 「オブジェクト参照がオブジェクトインスタンスに設定されていません」
> というエラーメッセージは、いずれかのオブジェクトが Nothing ですよーという意味です。
>
> DirectCast(ListView1.EditItem.FindControl("txtNAME"), TextBox).BackColor = Drawing.Color.Red
>
> このコードにおいて、エラーの原因となりうるオブジェクトは以下のものです。
>
> ListView1
> ListView1.EditItem
> ListView1.EditItem.FindControl("txtNAME")
>
> こんな感じで、1つずつ確認してみてはいかがでしょうか。
>
> Protected Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs)
> If ListView1 Is Nothing Then
> Debug.WriteLine("ListView1 は Nothing")
> Else
> Debug.WriteLine("ListView1 は Not Nothing")
> End If
>
> If ListView1.EditItem Is Nothing Then
> Debug.WriteLine("ListView1.EditItem は Nothing")
> Else
> Debug.WriteLine("ListView1.EditItem は Not Nothing")
> End If
>
> If ListView1.EditItem.FindControl("txtNAME") Is Nothing Then
> ...
>

こういう風に解析する、と言う事がまだ自分では思い浮かばす、勉強不足だと
つくづく感じます・・・・

もりおさんに教えていただいた解析方法で確認したところ、ListView1.EditItemが
Nothingになっていました。
ということは編集ボタンを押した段階ではEditItemTemplateのテキストボックスはまだ
作成されていないという認識でよろしいでしょうか?

また、その場合、テキストボックスが作成された後というのはイベントかなにかで
拾えるものなのでしょうか?
引用返信 編集キー/
■53823 / inTopicNo.7)  Re[6]: Listviewの編集ボタン押下時処理
□投稿者/ もりお (286回)-(2010/09/28(Tue) 00:07:49)
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" />

引用返信 編集キー/
■54074 / inTopicNo.8)  Re[7]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ (47回)-(2010/10/04(Mon) 18:20:29)
もりおさん、いつもいつもありがとうございます。


>
> 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" />
>

今回、 ListView1_PreRenderで処理を記述することによって、解決することが出来ました。
処理の発生タイミング、そのタイミングよって取得できる変数、
本当にいろいろと勉強になります。
いつも丁寧に解説していただきありがとうございます!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -