ListViewで行のアイテムを取得する方法

このQ&Aのポイント
  • ListViewで削除ボタン押下時に行のアイテムを取得する方法について教えてください。
  • 更新ボタンはListViewのOnItemUpdatingイベントからLabelコントロールを取得していますが、削除ボタンでは同じ方法が使えないようです。
  • 削除ボタンがItemTemplateとSelectedItemTemplateにしか置いていない場合、どのように行のアイテムを取得すれば良いのでしょうか。
回答を見る
  • ベストアンサー

ListView 削除ボタン押下時に値を取得したい

VS2012 c# WEBフォームです。 ListViewで削除ボタンを押したときに行のアイテムを取得したいのですが、方法を教えて下さい。 更新ボタンはListViewのOnItemUpdatingイベントから Label str_id = (Label)ListView1.EditItem.FindControl("idLabel1"); とすると取得きました。 同じように 削除ボタンはListViewのOnItemDeletingイベントから Label str_id = (Label)ListView1.SelectedItemTemplate.FindControl("idLabel1"); とすると、FindControlが使えない旨のメッセージが表示されます。 ItemTemplateでも同じです。 削除ボタンはItemTemplateとSelectedItemTemplateにしか置いていないのですが、 どのように取得すれば良いのでしょうか。。

質問者が選んだベストアンサー

  • ベストアンサー
  • onos
  • ベストアンサー率81% (127/155)
回答No.1

うーん、どういったら伝わるかなぁ。。。 むずかしいなぁ。 えっと、デザイン時というかプログラムで記述している状態と、実行されている時点でのオブジェクトの状態は異なることがあります。 ItemTemplateやSelectedItemTemplateは実行時は存在していないはずです。 実行時にはDataがバインディングされることによって普通の行に展開されています。 なので、実行時のListViewの内部の構成にあわせてFindControlを使う必要があります。 ただ、FindControl使って該当のコントロールとりだせたとしても、「どの行か?」というデータはわからないよーな。。。 ちょっと別のアプローチが必要な気がします。

ekekojr
質問者

お礼

下記で無事取ることができました。 お手数をおかけしました。 protected void ListView1_ItemDeleting(object sender,ListViewDeleteEventArgs e) { ListViewItem item =ListViewItem)ListView1.Items[e.ItemIndex]; Label idLabel = (Label)item.FindControl("idLabel"); }

ekekojr
質問者

補足

回答ありがとうございます。 >プログラムで記述している状態と、実行されている時点でのオブジェクトの状態は異なることがあります。 →こちらは理解しているつもりです >ItemTemplateやSelectedItemTemplateは実行時は存在していないはずです。 →削除ボタンですので、少なくとも行のレコードが存在しているので、  この状態でItemTemplateが存在していないということが理解できません。  EditItemTemplateであれば編集ボタンが押されていない状態で、  EditItemTemplateが存在しないことは理解できますが、  ItemTemplateも存在していないというのは本当でしょうか?  下記でチェックしてみるとItemTemplateは存在しているように見えます。  if (ListView1.ItemTemplate != null) { Debug.Print("ItemTemplate は ある"); } else { Debug.Print("ItemTemplate は ない"); }

関連するQ&A

  • 【Android】ListViewの削除ボタン

    こんにちは、Androidアプリの開発について、ご質問したいのですが、 ListViewでリストを作り、各行に削除ボタンを持たせ、それをクリックした場合に、 その行を削除するような画面を作成したいのですが、 行の削除方法が分かりません。 行ごとの削除ボタンのイベントは、AdapterのgetViewメソッドで定義すれば良いと わかりました。 また、リストの行自体をクリック(タッチ)したら、その行を削除するという例はいろいろ 見つけることができました。 何か良い情報や、HPをご存じの方がおりましたら、お教え下さい。 よろしくお願いします。

    • ベストアンサー
    • Java
  • GridViewからの値を全件LOOPして取得したい

    GridViewについて教えてください。 <環境>ASP.NET データソースにSQLDataSourceを指定し、GridViewに全件を自動バインドして表示しています。 画面上に設置したボタン押下のイベントハンドラで、そのGridViewの全行をループして各列の値を参照したいのですが、 以下のようなに記述しても(1)の部分でNOTHINGとなりエラーになります。 どのようにすればよいでしょうか? やりたいことは、GridView全行ループし、ITEMKINDの値が"1"の時、TemplateField内にあるtxtNVERCHARの値を取得することです。 ご教授お願いします。 --------------------------------- <Columns> <asp:BoundField DataField="ITEMKIND" HeaderText="ITEMKIND" Visible="False" /> </asp:BoundField> <asp:TemplateField HeaderText="ITEM"> <ItemTemplate> <asp:TextBox CssClass="txtstr" ID="txtNVERCHAR" runat="server" Text='<%# Bind("ITEM_NVERCHAR", "{0}") %>'></asp:TextBox> </ItemTemplate> </asp:TemplateField> </Columns> --------------------------------- Protected Sub 更新_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExec.Click For Each row As GridViewRow In grdList.Rows Dim strITEMKIND As TextBox = DirectCast(row.FindControl("ITEMKIND"), TextBox)  ←(1) IF strITEMKIND.Text = "1" THEN Dim strDDL As TextBox = DirectCast(row.FindControl("txtNVERCHAR"), TextBox) End IF Next End Sub

  • BASIC ListViewの選択された行番号を取得

    ActiveBasic4.23.00を使用しています。 ListViewで、ボタンを押すと選択されている行の番号(ListBoxで言うところのLB_GETCURSEL) を取得したいのですが、それらしい項目が見当たりません。 ご存知の方がいらっしゃいましたら、ご教授ください

  • チェックボックス とラジオボタンの値取得について

    チェックボックス とラジオボタンの値取得について こんにちは チェックボックスの中にラジオボタンがある場合に チェックボックスの値に続けてラジオボタンの値を表示したいのですが、 うまくいかず悩んでいます。 【やりたいこと】 □そのた2をチェクして男性を選択した場合 「そのた2 男性」と表示したい。 例 そのた1 そのた2 男性 そのた4 そのた5 女性 サンプルのチェックボックスのlabelタグをはずすと $(vals[i]).next($("input[name='radio']:checked").val()); で値を取得できたのですが、 labelタグを付けたまま値を取得することは可能でしょうか? labelタグをつけたまま、 $(vals[i]).find($("input[name='radio']:checked").val()); でやってみたのですが、undefindがでてしまいました。 サンプルではチェックボックスの数は1個ですが、 □が30個以上 のチェックボックスが50個くらいあるので、 1回の記述で済ませたいのですが、 ラジオボタンが隣にあったら値を取得する のようにできるのでしょうか? 何かよい方法があれば教えて頂けないでしょうか。 よろしくお願い致します。 ■サンプルソース <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <script type="text/javascript" language="JavaScript"></script> <script language="javascript"> <!-- function textb(){ var str=""; var vals = document.forms['f'].elements['q1']; for(i=0; i<vals.length; i++){ if(vals[i].checked){ str=str + vals[i].value + '\n'; } } document.f.log.value=str; } --> </script> <title></title> </head> <body> <form name="f"> <div>アンケート<br> <label for="1"><input type="checkbox" name="q1" class="chex" id="1" value="その1"> その1</label><br> <label for="2"><input type="checkbox" name="q1" class="chex" id="2" value="その2"> その2</label> <input type="radio" name="radio1" value="可">男性 <input type="radio" name="radio1" value="否">女性 <br> <label for="3"><input type="checkbox" name="q1" class="chex" id="3" value="その3"> その3</label><br> <label for="4"><input type="checkbox" name="q1" class="chex" id="4" value="その4"> その4</label><br> <label for="5"><input type="checkbox" name="q1" class="chex" id="5" value="その5"> その5</label> <input type="radio" name="radio2" value="可">男性 <input type="radio" name="radio2" value="否">女性 <br> </div> <input type="button" value="確認" onclick="textb()"> <input type="reset" value="クリア"> <br> <textarea name="log" rows="4" cols="50"></textarea></form> </body> </html>

  • DataGridViewから値取得

    DataGridViewにボタンと項目2つが配置されています。 DataGridView1 DataGridView1.Columns("btn").HeaderText = "ボタン" DataGridView1.Columns("item1").HeaderText = "アイテム1" DataGridView1.Columns("item2").HeaderText = "アイテム2" ボタンを押すと、押した行のレコードを取得したいです。 ボタンのところを押下すると、 イベントハンドラで何行目か分かるサンプルをネットで見つけました。 惜しいですが、やりたいのと少し違いました。 'CellContentClickイベントハンドラ Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick Dim dgv As DataGridView = CType(sender, DataGridView) Dim test_item1 As String Dim test_item2 As String ' "btn"列ならば、ボタンがクリックされた If dgv.Columns(e.ColumnIndex).Name = "btn" Then MessageBox.Show((e.RowIndex.ToString() + "行のボタンがクリックされました。")) End If ' ここに押された行のitem1の値をセット ' test_item1 = (A) ' ここに押された行のitem2の値をセット ' test_item2 = (B) End Sub (A)、(B)に何を記述すれば値を取得できますか?

  • ListViewで複数選択された項目を一度に削除する方法

    ListViewで選択された複数のアイテムの値の取得方法と複数選択された項目を一度に削除する方法を教えてください。

  • Flexgridで選択行の列の値を取得したい

    いつも参考にさせていただいております。 現在データベースからデータを取ってきてFlexgridに表示するプログラムを作りました。 そのフォームでFlexgridのある行を選択して削除ボタンを押すと、Flexgridの選択した行とデータベースのIDと一致した行を削除するようにしたいと思っています。 しかし、データベースの削除を行うためにFlexgridの選択した行のID列の値を取得しなければならないと思うのですが、どうやって取得すればよいのか分かりません。 どのようにすればよいでしょうか? サンプルなどあればよろしくお願いいたします。 ID  名前  部 ------------------ 01  佐藤  野球 02  鈴木  サッカー  ←例えばこの行を選択したら02を抜き出したい 03  田中  剣道 04  山田  柔道 05  高橋  バレー 環境:Window XP Pro、FlexGrid for .NET 4.0J、SQL Server 2005

  • javascriptでlabelの値取得

    vs2012(c#)で <asp:Label ID="test" runat="server" Text="abc" Visible="true"></asp:Label> の値をjavascriptで取得したいのですが、下記で実行すると l1はnullになり取得できません。 var l1 = document.getElementById("test"); var data = l1.innerText; console.log(data); そのようにすれば取得できるでしょうか

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • ListViewの複数項目削除で再度質問です

    ArrayListのソートの件とListViewのおかしな挙動は解決できたのですが 最初に質問して解決したはずの削除の部分で再び分からなくなって しまったので質問させて頂きます。 今回は本体に今までのコードを正式に組み込んで、動作の確認を 行っていたのですが、複数件(連続や個別選択)のデータ削除を 行おうとしたら意図しないデータ(未整列状態の並びのデータ)が 削除されてしまうという事態が発生してしまいました。 これはどうすれば解決できるのでしょうか? また複数件の未読既読を制御(選択された項目に対してフラグを 入れ替える)するのも同様の方法で出来るのでしょうか? 環境はVS2005(C#)、.NET Framework2.0です。 以下に問題の削除時のコードを載せます。 private void menuDelete_Click(object sender, EventArgs e) { // 選択アイテムが0のときは反応にしない if(listView1.SelectedItems.Count == 0){ return; } if(listView1.Columns[0].Text == "差出人"){ // 受信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[RECEIVE][sel_index]); collectionMail[RECEIVE].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "宛先"){ // 送信メールのとき for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].Add(collectionMail[SEND][sel_index]); collectionMail[SEND].RemoveAt(sel_index); } } this.textBody.Text = ""; } else if(listView1.Columns[0].Text == "差出人または宛先"){ // 削除メールのとき if(MessageBox.Show("選択されたメールは完全に削除されます。\nよろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK){ for (int sel_index = listView1.Items.Count - 1; sel_index > -1; sel_index--) { if (listView1.Items[sel_index].Selected) { collectionMail[DELETE].RemoveAt(sel_index); } } this.textBody.Text = ""; } } // ツリービューとリストビューの表示を更新する UpdateTreeView(); UpdateListView(); // 選択している位置がリストの件数よりも少ないとき if(currentRow < listView1.Items.Count){ // 選択していた位置-1の行にフォーカスを当て直す listView1.Items[currentRow - 1].Selected = true; listView1.Items[currentRow - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } else{ // リストの件数が1以上の時 if(listView1.Items.Count > 0){ // ListViewの行数位置-1の行にフォーカスを当て直す listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items[listView1.Items.Count - 1].Focused = true; listView1.SelectedItems[0].EnsureVisible(); listView1.Select(); listView1.Focus(); } } }

専門家に質問してみよう