3

久しぶりに髪を伸ばしました

ピクチャボックスで満たされたフォームを作成しました。各ピクチャ ボックスには、_click、_mousedown、および _mouseup イベントが含まれます。フォーム用に作成されたこれらのイベントを class1.cs に移動し、form1.cs にこれらのイベントを継承させたいと考えています。

私はpicturebox1を公開したくありません。Class1 classOne = new Class1(); のようなものです。pictureBox1.Click += new EventHandler(cs.pictureBox1_Click); 動作しないでしょう。

form1.cs に class1.cs を継承させる方法がわかりません。頭の中ではとても簡単に聞こえますが、私はただ精神的な空白にいます

クラス Form1 : Form, Class1 に疲れました

Form1.Designer.cs で this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); this.pictureBox1_Click にアクセスできません

あなたが私を正しい方向に向けることができれば、それは大きな助けになるでしょう! 乾杯

Form1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }
4

7 に答える 7

3

継承は「is-a」関係を定義するため、Form1Class1 でない限り、正しい方法でこれにアプローチしていません。設計しようとしているものに応じて、実際にはいくつかのオプションがあります。

  1. public メソッドを介してフォームをクラス インスタンスに渡し、クラスにイベント ハンドラーをアタッチさせます (動作を共有するフォームが複数ある場合、これらのケースではこれがより理にかなっているようです)。

  2. 一般的な動作をフォーム自体に (特殊なタイプのフォームとしてPictureClickingForm) 保存し、他のフォームにそれを継承させます。メソッドを保護できるようになりました。

これは、継承と封じ込めの問題です。そのように質問を表現すると、これに関するより多くの情報が得られます。

于 2012-04-19T01:24:24.693 に答える
2

Class1から継承する必要がFormあり、次にForm1から継承しClass1ます:

class Class1 : Form
{
    //...
}

public partial class Form1 : Class1
{
    //...
}

partialすべての宣言が からClass1ではなく から継承されていることを確認してくださいForm。(これにより、自動生成されたコードに余分なステップが追加される可能性があります。これは、クラスの古典的な理由ですpartial。そのための独自の自動化を作成する必要がある場合があります。)

私には明らかではないのは、との間に中間型を持つことによって達成しようとしていることFormですForm1Class1複数のフォームが継承する一般的な「基本フォーム」であるはずですか? それとも何か他のことをしようとしていますか?ただし、メンバーとして公開せずにForm1のメンバーにアクセスできるようにしたい場合は、代わりにそれらを作成できます。Class1publicprotected

于 2012-04-19T01:24:16.293 に答える
1

以下のように Class1.cs を変更することによってそれを達成できる唯一の方法

public partial class Form1
{
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }
于 2012-04-19T01:24:36.037 に答える
0

Picture Box 自体を公開する必要はありませんが、他の場所からアクセスできるように、Class1 のイベント ハンドラーを公開する必要があります。

ここで継承を特に必要とする理由は本当にわかりません。もう少し詳しい情報については、こちらをご覧ください。

于 2012-04-19T01:22:12.703 に答える
0

Form1からのイベントを購読しますClass1か? 次のようなことを試してください:

//Form1.cs
public partial class Form1 : Form
{
    Class1 class1;

    public Form1()
    {
        InitializeComponent();
        class1 = new Class1();
        this.pictureBox1.Click += new EventHandler(class1.pictureBox1_Click); 
    }
}

//Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
}

あなたがやろうとしているのは継承ではなく、単に外部オブジェクトに GUI イベントを通知することのようです。コードを再評価して、何をしようとしているのかを正確に考える必要があります。

于 2012-04-19T01:24:23.070 に答える
0

Form1 はクラスなので、Form1 から Form2 を継承するだけです。(一部を新しい Class1.cs ファイルにコピーしようとする代わりに) Form1.designer.cs は依然として Form1 定義の一部であり、グラフィカル フォーム デザイナーの目的のために脇に移動されています。しかし、定義には他の部分がないことに注意してください (デザイナーの場合でもありません!すべてが含まれています!)。

また、同じアセンブリから内部的にピクチャボックスにアクセスできるようにするために、クラスを公開する必要はありません。

オプション: Form1 で独自のイベントを作成するabstractvirtual、Form2 のようなサブクラスで Form1 のイベントの発生を処理するためのメソッドを作成することができます。

これは役に立ちますか?

于 2012-04-19T01:28:18.373 に答える