• ベストアンサー

C#でのコントロール配列について

C#でのコントロール配列について ピクチャーボックスを配列にして動的生成しています (日本語おかしい…?) そこで質問です。 あるピクチャーボックスをクリックすると クリックされたピクチャーボックスの値(?)とかを取得 (たとえば、Nameとか) 1つだけの場合なら、イベントのClickでできたんですが 配列にすると、どうすればいいのかわからなくなりました わかりやすいサイトとかあったら教えてください!

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

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

 こんにちは。  ピクチャボックスを作成する際にクリックイベントを登録した後、クリックイベントのsenderで判断すれば良いのでは。  雑ではありますが、以下参考程度に。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private PictureBox[] pictures = new PictureBox[0]; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for (int n = 0; n < 16; ++n) { Array.Resize(ref this.pictures, n + 1); this.pictures[n] = new System.Windows.Forms.PictureBox(); this.pictures[n].Location = new System.Drawing.Point((n % 4) * 32, (n / 4) * 32); this.pictures[n].Name = "pictureBox" + n.ToString(); this.pictures[n].Size = new System.Drawing.Size(32, 32); this.pictures[n].TabIndex = n; this.pictures[n].TabStop = true; this.pictures[n].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; //↓コレがないとだめ this.pictures[n].Click += new System.EventHandler(this.pictureBox_Click); this.Controls.Add(this.pictures[n]); this.pictures[n].Show(); } } private void pictureBox_Click(object sender, EventArgs e) { //senderはクリックされたピクチャボックスのどれか PictureBox pict = sender as PictureBox; MessageBox.Show(pict.Name); } } }

aniki23
質問者

お礼

ありがとうございます!! もう少し考えれば 自分がやりたい操作ができそうです!!

関連するQ&A

  • コントロールが配列かどうかを知るには?

    Visual Basic6.0(SP5)で伺いたいことがあります。 フォーム上の全てのオブジェクトを For Each文で取得しています。以下の様にです。 Dim Control As Object For Each Control In Form1.Controls If TypeOf Control Is Text Then End If Next Control このとき個々のControlがコントロール配列かどうかを知りたいのですが、どうすればよろしいでしょうか?フォーム上にはコントロール配列のオブジェクトも、コントロール配列ではないオブジェクトもあります。 Control.Indexの値を参照しようとしても、コントロール配列でない場合は 「配列ではないオブジェクトです」とエラーになります。 IsArray関数でもFalseになってしまいます。 何を行いたいかというと、そのControlがコントロール配列(Text1(0)とかText1(1)とか)かどうかを調べて、そのIndexをある関数の引数にしたいのです。全てコントロール配列だったら、Control.Indexで値を取得できるのですが。 よろしくお願いします。

  • 【C#】インデックス番号(?)の取得

    いつもお世話になってます。 C#に関して質問です。 VisualC#2008を使用しています。 private System.Windows.Forms.PictureBox[] kihon_pic = new PictureBox[100]; のように、ピクチャーボックスのコントロール配列を作り、あるピクチャーボックスがクリックされたときに、そのピクチャーボックスのインデックス番号(?)を取得できるようにしたいと思っています。 例えば、クリックされたピクチャーボックスはkihon_pic[4]であるとか、kihon_pic[7]であるとか、そういった具合にです。 誰か方法が分かる人がいましたら、ご回答をよろしくお願いします。

  • ユーザコントロールのイベント取得について(C#)

    環境:Visual Studio 2005 C# Windows Application フォームに自作のユーザコントロールを貼り付けてそのイベントを取得する勉強をしているものです。 フォームでのユーザコントロールイベントを取得して処理をする方法が分かりません。 状況 ユーザコントロールにはテキストボックスを追加しています。 また、フォームにそのユーザコントロールを追加しています。 確認したいことは、ユーザコントロールのテキストボックスになにか値を入力したタイミングでチェンジイベントをフォーム側で察知し、処理をするというものです。 どなたか、要点だけでもいいので教えていただけないでしょうか? 宜しくお願いいたします。

  • C#チャートコントロールで

    チャートコントロールで折れ線グラフを表示しています。 Mousedownやclickイベントを用いて、 クリックしたデータ点の値を取得したいと考えています。 どのようなコードを書けばいいでしょうか? わからずに困っています。 アドバイスお願いいたします。

  • ASP.NET(C#)実体のないコントロール

    お世話になっております。 標題の用に、実体のないコントロールの値の取得について質問させて頂きます。 対象のaspxの中に複数のアップデートパネルを配置しています。 そのうちの一つが、JavaScriptで動的に生成されたコントロールでできています。 JavaScriptで生成されているため、ソースを見てもコントロールの実態はありません。 JavaScriptからは、jQueryを利用し、$("#hoge").val() の形式で値は取得できます。 C#側からは、実体がないため当然、hoge.Textとしてもエラーとなってしまいます。 アップデートパネル内の、JavaScriptで動的に生成されたコントロールをC#側から取得する方法があればご教授いただけますと助かります。 もしくは、動的に生成されているhtmlから簡単にC#側のコントロールを生成する方法はないでしょうか。前提として、このアップデートパネルないのコントロールはJSで数や項目がかわってしまいます。その変更に対しては都度サーバとの通信は行っていません。 無理な質問かと思いますが、どうぞよろしくお願い致します。

  • C# ブラウザをコントロール

    C#でブラウザをコントロールすることは可能でしょうか? Webサイト上にあるフォームに任意の値を入力させたいのですが。 また、任意の箇所でイベントを発生させることは可能でしょうか? クリックや、Enterキーを入力するなど。 具体的に言うと、自動的にログインしたいです。

  • コントロール配列の動的配置について

    ソース上でコントロール配列を動的に配置する場合の手法が解りません。 フォーム上に貼り付けられたコントロール配列を、動的に可変させるにはLOAD/UNLOADなどで良いようですが、1つめの要素(0)から動的に生成させる事は出来ないものでしょうか? ご存知の方いらっしゃいましたら、よろしく手ほどきのほどお願いいたします。

  • C#でコントロールを角丸に

    C#でコントロール(ピクチャボックスなど)の角を丸くする方法を教えてください。 いろいろ調べてみたのですが初心者なので理解できなかったです。 できればわかりやすくお願いします。

  • VB2005でのコントロール配列?

    お世話になってます。 私はVB入門者です。 使用している用語などに間違いなどがありましたら ツッコんでやって下さい。 VB2005にて、フォーム内にcomboboxが10個あります。 Load時にT_boxの1~10に同じ、配列case_T を代入したいのですが 下記のコードをどのように直せばよいのでしょうか。 VB6まではコントロール配列?というものが、あったようですが 今回求めている処理はそのコントロール配列に該当するのでしょうか? -------------------------------- case_T内の値は 動的な値A,b,c,d,e,f,gがはいっていて それをT_boxの1~10に格納したいです -------------------------------- Dim T_box() As ComboBox = {T_box1, T_box2, T_box3, T_box4, T_box5, T_box6, T_box7, T_box8, T_box9, T_box10} Dim m As Short ReDim T_box(T_box.Length - 1) For n = 0 To T_box.Length - 1 T_box(cont + 1).Items.Clear() For m = 0 To case_T.Length - 1 T_box(cont + 1).Items.Add(case_T(cont)) cont += 1 Next Next T_box1.ResetText() cont = 0 End Sub

  • コントロールの配列について

    VB2005で質問です。 初心者のため勉強しながら作成している為かうまくできません。コントロール配列を使ってボタンを204個、 チェックボックスを768個表示するプログラムを作りました。 6個のボタンのうち、1個のボタンをクリックすると128個のチェックボックスがONし、 別の6個のボタンのうち1個は、128個のチェックボックスがOFFし、 96個のボタンは、1個押すと8個のチェックボックスがONし、残りの96個はOFFするプログラムを作成していますが、 配列に登録した名前でクリックイベントハンドラーを作成すると 「HANDOLES句には、それを含む型または基本型の1つで定義されたWith Events変数が必要です」というエラー表示が出ます。 またチェックボックスも同じように名前は宣言されていませんと出ますが、 どう直せば良いか把握できていないのでどなたか教えて貰えないでしょうか。 Dim chkIo(768) As System.Windows.Forms.CheckBox Dim btnIdOn(6) As System.Windows.Forms.Button Dim btnIdOff(6) As System.Windows.Forms.Button Dim btnIoOn(96) As System.Windows.Forms.Button Dim btnIoOff(96) As System.Windows.Forms.Button Const strName1 As String = "chkIo" Const strName2 As String = "btnIdOn" Const strName3 As String = "btnIdOff" Const strName4 As String = "btnIoOn" Const strName5 As String = "btnIoOff" Dim i As Integer Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For c = 0 To 5 For i = 0 To 127 Checkboxio() Next b = 0 ButtonIoOn() b = 0 ButtonIoOff() ButtonIdOn() ButtonIdOff() Next End Sub Public Sub Checkboxio() chkIo(i) = New CheckBox With chkIo(i) .Size = New Size(15, 15) If i < 8 Then a = i b = 0 Contchk() 以下省略 ElseIf i < 128 Then a = i - 120 b = 15 Contchk() End If End With Me.Controls.Add(chkIo(i)) End Sub Public Sub Contchk() With chkIo(i) .Location = New Point((a * 25) + (290 * c) + 80, (b * 35) + 75) a = a + (10 * b) + (200 * c) .Tag = a .Name = strName1 & a.ToString End With End Sub Public Sub ButtonIoOn() For i = 0 To 15 btnIoOn(i) = New Button With btnIoOn(i) a = i .Size = New Size(15, 15) .Location = New Point((290 * c) + 19, (b * 35) + 74) a = a + (20 * c) .Name = strName4 & a.ToString b = b + 1 End With Me.Controls.Add(btnIoOn(i)) Next End Sub Public Sub ButtonIoOff() For i = 0 To 15 btnIoOff(i) = New Button 以下省略 Next End Sub Public Sub ButtonIdOn() 以下省略 End Sub Public Sub ButtonIdOff() btnIdOff(c) = New Button With btnIdOff(c) .Size = New Size(15, 15) .Location = New Point((290 * c) + 154, 29) .Name = strName3 & c.ToString End With Me.Controls.Add(btnIdOff(c)) End Sub ここからエラーがでたプログラムです Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIdOn.Click, btnIdOn1.Click, btnIdOn2.Click, btnIdOn3.Click, btnIdOn4.Click, btnIdOn5.Click, btnIdOff0.Click, _ btnIdOff1.Click, btnIdOff2.Click, btnIdOff3.Click, btnIdOff4.Click, btnIdOff5.Click, btnIoOn0.Click  Select Case DirectCast(sender, Button).Name Case btnIoOn0.Name For i = 0 To 7 Me.chkIo(i).Checked = True Next End Select End Sub