从外部的 Button click 事件中为 class 中的变量赋值。但是返回零作为另一个按钮点击的输出

Assigned values to a variable in a class from Button click event outside. But returning zero as output from another button click

这里我在 class 中有一个变量,并试图通过 class 外部的按钮提供输入和获取输出。但是当我为 class(按钮 2)创建新对象时,我没有得到给定的输出值(按钮 1)。

    class dataconversion
    {

        public List<decimal> sample = new List<decimal>();

        public void dataconvert(List <decimal> transfer)
        {
            string filedata;
            Stream filestream;
            OpenFileDialog opendialog = new OpenFileDialog();
            if (opendialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if ((filestream = opendialog.OpenFile()) != null)
                {
                    filedata = System.IO.File.ReadAllText(opendialog.FileName);
                    List<string> stringlist = new List<string>(filedata.Split(' ', '\n', '\t'));
                    stringlist = stringlist.Where(val => val != "").ToList();
                    List<decimal> decimallist = stringlist.ConvertAll(s => decimal.Parse(s));
                    transfer.AddRange(decimallist);
                }

            }

        }

    }

    public class methodacess
    {
        dataconversion dc = new dataconversion();

        public void sampleaccess()
        {
            dc.dataconvert(dc.sample);

        }

        public void messages()
        {
            MessageBox.Show(dc.sample.Count.ToString());
        }

//output is giving only zeros.
   }
   private void button1_Click(object sender, EventArgs e)
    {
        methodacess ma = new methodacess();
        ma.sampleaccess();
     }

    private void button4_Click(object sender, EventArgs e)
    {
        methodacess ma4 = new methodacess();
        ma4.messages();
    }

}

你的问题是 button4_Click 中的这一行:

methodacess ma4 = new methodacess();

您正在创建 methodacess 的全新实例。

事实上,您在 button1_Click 中创建的那个并没有存储在任何地方,而是在方法退出后丢失了。

所以您对 ma.sampleaccess(); 的调用与对 ma4.messages(); 的调用在不同的实例上,所以难怪没有数据。

现在,我不喜欢你构建 类 的方式。确实有点奇怪,但我会坚持使用这种结构。

首先,dataconversion - 使用单个函数将其设为静态,returns 列表的新副本。

public static class dataconversion
{
    public static List<decimal> dataconvert()
    {
        var filedata = "";
        using (var opendialog = new OpenFileDialog())
        {
            if (opendialog.ShowDialog() == DialogResult.OK)
            {
                if (System.IO.File.Exists(opendialog.FileName))
                {
                    filedata = System.IO.File.ReadAllText(opendialog.FileName);
                }
            }
        }
        return
            filedata
                .Split(' ', '\n', '\t')
                .Where(val => val != "")
                .Select(s => decimal.Parse(s))
                .ToList();
    }
}

现在,methodaccess - 注意它现在只包含实际的小数列表:

public class methodacess
{
    List<decimal> data = new List<decimal>();

    public void sampleaccess()
    {
        data = dataconversion.dataconvert();
    }

    public void messages()
    {
        MessageBox.Show(data.Count.ToString());
    }

}

最后是您的 UI 调用代码:

private methodacess ma = new methodacess();

private void button1_Click(object sender, EventArgs e)
{
    ma.sampleaccess();
}

private void button4_Click(object sender, EventArgs e)
{
    ma.messages();
}

请注意,只有一个实例 methodaccess