• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# 動的に読み込んだコントロールの削除)

C#で動的なコントロールの削除方法

このQ&Aのポイント
  • C#で動的に読み込んだ不特定多数のコントロールを正しく削除する手順とは?
  • 不特定多数のコントロールを削除する方法には注意が必要です。
  • メモリリークを避けるためにはDispose()を使用しましょう。

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

  • ベストアンサー
回答No.1

コレクションや配列になっているのを削除する場合は、後ろから削除しないと上手く削除されません。 以下のような方法になります。(実際のソースとはプロパティ等が異なります) For (int idx= panel.Controls.個数-1; 0<=idx; idx--) { panel.Controls[idx].Dispose(); }

ctmogawa
質問者

お礼

ありがとうございます。 無事に全部解放できました。 一応記録としてソースの方を乗せておきます。 // コントロール削除ボタン Button delete = new Button(); delete.Size = new Size(50, 25); delete.Text = "delete"; delete.Click += (ss, ee) => { for(int i = panel.Controls.Count -1; i >= 0; i--) { if (panel.Controls[i] is TextBox) { ((TextBox)panel.Controls[i]).Dispose(); } } }; panel.Controls.Add(delete);

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#で動的に配置したコントロール

    はじめまして 開発歴1年未満の開発者ですがよろしくお願いします。 開発環境 Visual Studio 2008 C# ASP.NET protected void Page_Load(object sender, EventArgs e) { TextBox TextBox = new TextBox(); TextBox.ID = "TextBox1"; TextBox.Text = "C# ASP.NET"; form1.Controls.Add(TextBox); } protected void Button1_Click(object sender, EventArgs e) { string strTextBox1 = ??????? } と上記のように読み込み時に、テキストボックスのみを動的に配置し、デザイナで配置したのボタンを押した際に、テキストボックスに入力された値を、取得したいのですが、方法がわかりません・・・ お忙しいとは、思いますがご回答よろしくお願いします。

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • コントロール配列について、基礎で躓いています。

    Visual Basic 2010でプログラムを作成しています。 今、ラベルが約30個フォームに貼ってあり、そのtextをすべてtextbox1のtextに変更されるようにしたいと考えています。 Label1.text = Textbox1.text Label2.text = Textbox1.text としていけば確実なのでしょうが、簡素化したいのです。 いろいろと検索して心身ともに消耗しきったため、最後の綱として質問させていただきました。 たとえばtextbox1のコードとして Dim btn(30) As Button For i = 1 To 30 btn(i) = Me.Controls("Button" & CStr(i + 1)) btn(i).Text = CStr(i + 1) Next i と書きいれるとNullReferenceExceptionというエラーが出てきてしまいます。 何か書き足りないのでしょうか。何卒よろしくお願いします。

  • VB2005 コードでのコントロールのコピーについて

    いつもお世話になっています。 独学でVBの勉強をしているものなのですが、 どうしてもわからないことがあるので教えてください。 デザイナの画面で配置したテキストボックスなどのコントロールを、 コードでコピーして複数配置するようにしたいんです。 そこで、デザイナでTextBox1を配置して、 コードで以下のように記述しました。 Dim MyTextBox1 As New TextBox MyTextBox1 = TextBox1 Me.Controls.Add(MyTextBox1) すると、デザイナ画面で配置したテキストボックスが無くなって、 新たにコードで作成したテキストボックスだけが、 画面に表示されてしまうんです。 実際に行いたいことは、複数のコントロールをパネル上に配置して、 そのパネルをコードで複数作成することなのですが、 そもそもそのようなことはできないのでしょうか? かなり的外れな質問になってしまっているかもしれませんが、 お分かりでしたら教えてください。 よろしくお願いします。

  • C#のforeachに苦しめられてます。

    foreachで複数のDLLの情報をもってきて、一つのコレクションに集めます。集めたコレクションの次のコレクションに移ると最初のコレクションの情報が上書きされてしまうのが悩みです。 foreach (var e in dll) { var PictureBox1 = new PictureBox();//画像が表示される場所はずれて重ならなくなっている。 PictureBox1.Click += (s, e) => { 既につくられているtextBoxの削除("textBoxの名前");//名前指定で削除できる自作関数 既につくられているbuttonの削除("buttonの名前"); 関数(); } } DLL1.dll 関数(){   textBoxの作成(); buttonの作成();   クリックしたときのイベント{    textBox.Text="DLL1";   } } DLL2.dll 関数(){   textBoxの作成(); buttonの作成();   クリックしたときのイベント{    textBox.Text="DLL2";   } } どちらの画像(PictureBox1)をおしても、ボタンとtextboxが作られますが、なぜか、2回目の画像のクリックではボタンの削除がうまくいかず、textBoxだけが削除され作り直されます。 さらに、どちらのボタンを押してもtextboxにはDLL2が入力されてしまいます。 どのように解決したらよいでしょうか?

  • EXECLの行を削除

    こんにちは 質問があります。 以下のコードのように、 テキストボックスに入力した行数の エクセルの行を削除したいのですが、 何も削除されません。 どなたか解決策を教えていただけないでしょうか よろしくお願いいたします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; class testdel { public static void main(String[] args) { testdel2 test=new testdel2(); } } class testdel2 implements ActionListener { JButton button; JTextField text; testdel2() { JFrame frame=new JFrame(); JPanel panel=new JPanel(); button=new JButton("削除"); text=new JTextField(1); button.addActionListener(this); panel.add(text); panel.add(button); Container ct=frame.getContentPane(); ct.add(panel); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button) { int del_row=Integer.parseInt(text.getText()); Delete del=new Delete(del_row); } } } class Delete { Delete(int delrow) { try {System.out.println(delrow); FileInputStream fis = new FileInputStream("c:/sample.xls"); POIFSFileSystem fs = new POIFSFileSystem(fis); HSSFWorkbook wb1 = new HSSFWorkbook(fs); HSSFSheet sheet = wb1.getSheetAt(0); HSSFRow row=sheet.getRow(delrow); sheet.removeRow(row); System.exit(0); } catch(Exception e) { System.err.println(e.toString()); } } }

    • ベストアンサー
    • Java
  • C# ボタンコントロール内で文字の改行

    C#でWindowsアプリケーションを作成しています。 ユーザーコントロールでカスタマイズしたボタンを作成しました。 また、そのボタンを動的に配置していく処理を作成しました。 ボタンに表示するボタン名(文字列)が長いものもあるので、改行を させようと思い、以下のようなコードを書きました。 UCtl.BT_Button1.Text = "あ" + Environment.NewLine + "い"; また、このユーザーコントロール「UCtl」は以下の配列に格納します。 cControl1 = new Control[5]; その後、パネルの上に追加していっています。 wPanel.Controls.Add(cControl1[0]); wPanel.Controls.Add(cControl1[1]); しかし、期待する結果”あ”改行”い”と表示されず、”あ”のみが表示されます。 原因として考えられることがお分かりの方がいらっしゃればお教えいただきたいです。 以上です。

  • 【VB2005】コントロールを配列に。

    下記のコードを変更して、コントロールの値を配列に代入して、 その値をもとに、ボタンを複製して追加したいと思っています。 Public Class frmStart Dim btnNewButton1 As New Button Private Sub frmStart_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load NewButton1.Text = "処理1" btnNewButton1.ForeColor = Color.DimGray btnNewButton1.Location = New Point(10, 100) btnNewButton1.Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton1) end sub End Class やりたいことは、Dim btnNewButton() As New Button のようにデータを配列にして、 btnNewButton(0).ForeColor = Color.DimGray btnNewButton(0).Location = New Point(10, 100) btnNewButton(0).Size = New Size(180, 30) btnNewButton(1).ForeColor = Color.DimGray btnNewButton(1).Location = New Point(380, 100) btnNewButton(1).Size = New Size(180, 30) '// ボタンを追加します Me.Controls.Add(btnNewButton(0))     Me.Controls.Add(btnNewButton(1)) という事をしたいのですが、方法が解らなくて困ってます。 お知恵を貸してください。

  • C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか

    C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか? C#2008ですが、Form1にTextBoxが30個あって、textBox1~textBox30という名前がついています。 このテキストボックスの値をForm2で取得したいのですがなかなかうまくいきません。 ------------------------- Form2: private void Form2_Click(object sender, EventArgs e){  Form1 fm = new Form1();    int No = 15; //ここを1~30まで動的にしたい  string result = fm.textBox15.Text; //直接comboBox_type15と書くのではなく「"comboBox_type" + No.ToString()」のようにしたい  MessageBox.Show(result); } ------------------------- コントロールを配列にして Control[] ctlArray = new Control[30] { fm.textBox1, fm.textBox2, …, fm.textBox30 }; のようにしてみましたが、エラーになってしまいます。 いろいろネットで検索してみたのですが、「コントロール名を動的に文字列で作成して使う」という方法がどこにも載っていなく、数時間格闘しています。 すみませんがご教授願います。よろしくお願いいたします。

  • SQL Server2012 とC#

    DataGridViewで選択した行を他の処理に渡したくて、Netで調べて、次のようにしてみました。 DataSet ds = new DataSet(); SqlDataAdapter adpt = new SqlDataAdapter(); DataTable tbl = new DataTable("Movies"); ds.Tables.Add(tbl); for(int i=0; i<DataGrifView1.ColumnCount; i++){ tbl.Columns.Add(DataGridVew1.Columns[i].Name,DataGridView1.Columns[i].ValueType); } foreach(DataGridViewRow dr in DataGridView1.SelectedRows){ DataRowView rv= (DataRowView)dr.DataBoundItem; tbl.ImportRow(rv.Row); } ここで、出来たDataSet dsを、他のフォームに渡しました。そのフォームにはDataBindingNavigator1と、内容を表示するためのテキストボックスがあります。フォームLoadで次のように ナビゲータと各テキストに設定しました。 BindingSource1.DataSource = ds; BindingSource1.DataMember = "Movies"; DataBindingNavigator1.BindingSource = BindingSource1; textBox1.DataBindings.Add(new Binding("Text", ds, "Movies.邦題")); textBox2.DataBindings.Add(new Binding("Text", ds, "Movies.原題")); textBox3.DataBindings.Add(new Binding("Text", ds, "Movies.読み")); textBox4.DataBindings.Add(new Binding("Text", ds, "Movies.制作国")); textBox5.DataBindings.Add(new Binding("Text", ds, "Movies.制作年")); textBox6.DataBindings.Add(new Binding("Text", ds, "Movies.上映時間")); DataGridViewの複数の行を選択して、この処理を行うと、ナビゲータには、Rowの行数分だけのレコード数の分母が表示され、各テキストにはそれぞれのレコードの内容の内の一件分が表示されています。 Q1:  ここで、ナビゲータの進むボタンを押してみると、レコード位置を示す数(分子の方)が進むのに、テキストの内容が変化しません。何か、やり足りないのでしょうか? Q2:  DataGridViewの左上の行ヘッダと列ヘッダの交わる部分をクリックして、全選択(のつもりで)この処理を呼ぶと、SelectedRowの内容が読めないようで、NullReferenceExceptionのハンドルされていない例外が発生して、「オブジェクト参照がオブジェクトインスタンスに設定されていません」と言われます。デバッガでSelectedRowを追っても、行数はあるものの内容がありません。全選択は使用方法が違うのでしょうか?

野草の名前を教えてください
このQ&Aのポイント
  • 札幌の河川敷に咲いていた野草の名前を教えてください。
  • 札幌の河川敷で見かけた野草の名前を教えてください。
  • 札幌の河川敷に生えている野草の正体を知りたいです。
回答を見る

専門家に質問してみよう