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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.53692 の関連記事表示

<< 0 >>
■53692  Listviewの編集ボタン押下時処理
□投稿者/ まさひろ -(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
    で、「オブジェクト参照がオブジェクトインスタンスに設定されていませんん」と言うエラーが
    出てしまいます。
    編集ボタンを押下したときにテキストボックスのバックカラーを変更するにはどのようにすれば
    良いのでしょうか?
    ご教授お願いします。
親記事 /過去ログ90より / 関連記事表示
削除チェック/

■53696  Re[1]: Listviewの編集ボタン押下時処理
□投稿者/ PATIO -(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
    > で、「オブジェクト参照がオブジェクトインスタンスに設定されていませんん」と言うエラーが
    > 出てしまいます。
    > 編集ボタンを押下したときにテキストボックスのバックカラーを変更するにはどのようにすれば
    > 良いのでしょうか?

    エラーの内容に関してもう少し突き詰めてみませんか。
    まさひろさん自身はどの部分が一番怪しいと思います?
    で、そこがうまく行っていないとしてなぜうまく行かないんでしょう?
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53779  Re[2]: Listviewの編集ボタン押下時処理
□投稿者/ マサヤ -(2010/09/27(Mon) 10:00:51)
    txtNAMEというプロパティ名のコントロールがないのではないですか?
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53790  Re[3]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ -(2010/09/27(Mon) 13:51:45)
    PATIOさん、マサヤさんありがとうございます。


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

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

    btnEdit_Clickのイベントの時点ではまだテキストボックスのオブジェクトが作成されていない
    と言う事でしょうか・・・・?
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53802  Re[4]: Listviewの編集ボタン押下時処理
□投稿者/ もりお -(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
        ...
      
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53810  Re[5]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ -(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のテキストボックスはまだ
    作成されていないという認識でよろしいでしょうか?

    また、その場合、テキストボックスが作成された後というのはイベントかなにかで
    拾えるものなのでしょうか?
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■53823  Re[6]: Listviewの編集ボタン押下時処理
□投稿者/ もりお -(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" />
記事No.53692 のレス /過去ログ90より / 関連記事表示
削除チェック/

■54074  Re[7]: Listviewの編集ボタン押下時処理
□投稿者/ まさひろ -(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で処理を記述することによって、解決することが出来ました。
    処理の発生タイミング、そのタイミングよって取得できる変数、
    本当にいろいろと勉強になります。
    いつも丁寧に解説していただきありがとうございます!
記事No.53692 のレス / END /過去ログ90より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -