-1

我有代码,我知道我已经完成了 99% 的工作。MS VS2008 中的 C# 编码。

基本上我有一个有 4 个单选按钮和一个继续按钮的表单。用户单击其中一个单选按钮并单击继续,这一切正常。

但是,我想使用用户输入的值(即,如果他们单击第一个按钮,我想要一个等于 1 的变量,第二个按钮等于 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) 将您的变量声明为公共实例变量(如上所示,但公共的;当您为它们提供 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.

我希望这对你的追求有所帮助。

于 2012-10-26T20:53:04.757 回答
0

如果您在设计视图中选择一个控件,属性窗口将包含一个名为“Modifiers”的项目。您可以在此处公开控件。

更好的方法是在您的表单上创建一个新的公共属性,该属性会产生当前选定单选按钮的值。

于 2012-10-26T19:29:20.610 回答