-1

私はコードを持っています、そして私はそこまでの道のりの99%を知っています。MS VS2008でのC#コーディング。

基本的に、4つのラジオボタンと[続行]ボタンがあるフォームがあります。ユーザーがラジオボタンの1つをクリックし、[続行]をクリックすると、これはすべて正常に機能します。

ただし、ユーザーが入力した値を使用したい(つまり、ユーザーが最初のボタンをクリックした場合、1に等しい変数が必要で、2番目のボタンは2に等しいというようになります)。これをさまざまなポイントで試しましたが、実行できるのはプライベートvoid btnOkClick行だけです。つまり、このvoidの外側の値を使用できます。これは、私が本当に望んでいることです。

いくつかの列挙型などを設定して遊んでみましたが(以下のコードでコメント化されています)、うまくいきません。私は近くにいる必要があることを知っていますが、私は投稿を読み続けており、それを完全に把握することができないので、私の初心者は本当に現れています。

つまり、VS2008プロジェクトの他のクラスで、ユーザーが初期フォームで選択した値を参照できるようにしたいと考えています。

namespace AmortClient
{
    public partial class frmLoadACTFCST : Form
    {
        public frmLoadACTFCST()
        {
            InitializeComponent();
            //set the parent of the form to the container
            //this.MdiParent = parent;
        }

        //public enum ACTFCST
        //{
        //    ACT = 1,
        //    FCST = 2,
        //    PLAN = 3,
        //    FiveYearPlan2012=4
        //}

        //private ACTFCST _actfcst = ACTFCST.ACT;
        //public ACTFCST actfcst
        //{
        //    get { return _actfcst; }
        //    set { _actfcst = value; }
        //}

        private void frmLoadACTFCST_Load(object sender, EventArgs e)
        {            

        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void btnActual_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void btnForecast_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void btnPlan_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void btn5YrPlan2012_CheckedChanged(object sender, EventArgs e)
        {

        }    

        private void btnContinue_Click(object sender, EventArgs e)
        {
            string ACTFCSTtext = "";
            int dataTypeKey = 0;

            if (btnActual.Checked)
            {
                ACTFCSTtext = btnActual.Text;
                dataTypeKey = 1;
            }
            else if (btnForecast.Checked)
            {
                ACTFCSTtext = btnForecast.Text;
                dataTypeKey = 2;
            }

            else if (btnPlan.Checked)
            {
                ACTFCSTtext = btnPlan.Text;
                dataTypeKey = 3;
            }

            else if (btn5YrPlan2012.Checked)
            {
                ACTFCSTtext = btn5YrPlan2012.Text;
                dataTypeKey = 4;
            }

            string msg = "";
            msg = ACTFCSTtext + " " + dataTypeKey;

            //btn5YrPlan2012
            MessageBox.Show(msg);
            Close();

        }

    }
}
4

3 に答える 3

1

フォーム内の他のメソッドからアクセスする場合は、dataTypeKey変数とACTFCSTtext変数をFormオブジェクトのインスタンス変数として宣言する必要があります。それらを他のフォームで使用する場合は、コンストラクター引数として渡すか、他のフォームのいくつかのプロパティを設定できます。

したがって、インスタンス変数にする場合は、クラス宣言の直後に宣言します。これらは引き続きプライベートである必要があります。つまり、frmLoadACTFCSTクラス内からのみアクセスできます。

public partial class frmLoadACTFCST : Form
{
    private string ACTFCSTtext = "";
    private int dataTypeKey = 0;
...

編集:別のオブジェクト(または静的クラス)の1つのオブジェクトから変数にアクセスする場合、オプションは次のとおりです...

1)変数をパブリックインスタンス変数として宣言します(上記と同じですが、パブリックです。これらは、getterメソッドとsetterメソッドを指定するとプロパティと呼ばれます)。これらの変数にアクセスする必要があるクラスには、変数を所有するクラスへの参照が必要です。

例:FormAにはSomeStringという名前のパブリックプロパティがあります。FormBはSomeStringにアクセスする必要があります。FormBにはFormAへの参照が必要であり、次のように変数にアクセスします...

formAReference.SomeString

2)変数の値を、アクセスが必要なクラスのメソッドに引数として渡します。

例:FormAには、SomeStringという名前のプライベートインスタンス変数があります。FormBはSomeStringにアクセスする必要があります。FormAがFormBをインスタンス化する場合、SomeStringの値をFormBのコンストラクターに渡すことができます...

//From within FormA's code
FormB formB = new FormB(SomeString);

//FormB's constructor
public FormB(string someString)
{
    this.someString = someString;
}
于 2012-10-26T19:32:41.390 に答える
1

たぶんそれを行うためのより賢い方法があります。

public partial class frmLoadACTFCST : Form
{
    public frmLoadACTFCST()
    {
        InitializeComponent();

        actfcst = ACTFCST.ACT;
        btnActual.Tag = ACTFCST.ACT;
        btnActual.Checked = true;
        btnForecast.Tag = ACTFCST.FCST; 
        btnPlan.Tag = ACTFSCT.PLAN;
        btn5YrPlan2012.Tag = ACTFCST.FiveYearPlan2012;
    }

    public enum ACTFCST
    {
        ACT = 1,
        FCST = 2,
        PLAN = 3,
        FiveYearPlan2012=4
    }

    public static ACTFCST actfcst { get; private set; }

    private void CheckedChanged(object sender, EventArgs e)
    {
        // All the buttons uses this Click-event.
        actfcst = (sender as Button).Tag as ACTFCST;
    }

    private void btnContinue_Click(object sender, EventArgs e)
    {
        MessageBox.Show(actfcst.ToString());
        Close();
    }
}

重要なのは、すべてのボタンがクリックされるとCheckedChangedを呼び出すということです。

静的を使用するということは、他の人が次のようなものを使用して値にアクセスできることを意味します。

frmLoadACTFCST.ACTFCST value = frmLoadACTFCST.actfcst;
// Do something based on value.

これがyoyrの探求に役立つことを願っています。

于 2012-10-26T20:53:04.757 に答える
0

デザインビューでコントロールを選択すると、プロパティウィンドウに「Modifiers」という名前のアイテムが含まれます。ここでコントロールを公開できます。

より良い方法は、現在選択されているラジオボタンの値を生成する新しいパブリックプロパティをフォームに作成することです。

于 2012-10-26T19:29:20.610 に答える