从外部的 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
。
这里我在 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
。