这次我必须在函数中转换先前编写的代码并在代码中调用该函数。我在引用我的标签盒时遇到问题,似乎无法找到答案。这是代码:
private void btnEndSale_Click(object sender, EventArgs e)
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
以及我试图将其变为:
static void PurchaseTotal(ref double dblSubtotal, ref double dblTaxTotal, ref double dblGrandTotal, object lbxTally)
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
所以我可以使用:
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal()
}
我有点迷失如何引用对象标签框(或者如果我需要?),如果我需要在调用它时在PurchaseTotal函数中再次引用我的变量。任何帮助表示赞赏!谢谢!
答案 0 :(得分:4)
根据事物的外观,您需要的所有对象都作为类成员存在(例如,它们在表单本身中声明),因此您可以从任何实例方法中引用它们。
话虽如此,你应该能够做到这一点:
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal();
}
private void PurchaseTotal()
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
答案 1 :(得分:0)
您无法使PurchaseTotal成为静态。所以只需删除static关键字。
修改1
有两种方法可以做到这一点。一种方法是将方法保持为静态并传入标签。这是一个例子:
static void PurchaseTotal(LabelBox lbxTally, ref double dblSubtotal, ref double dblTaxTotal, ref double dblGrandTotal)
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
现在你需要将标签传递给函数......
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal(lbxTally, ref dblSubtotal, ref dblTaxTotal, ref dblGrandTotal);
}
另一种方法是删除静态因为你的lbxTally变量是本地的,静态方法不知道你的局部变量。所以你需要改变它看起来像这样
void PurchaseTotal()
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
现在你调用这个没有参数的函数
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal();
}
答案 2 :(得分:0)
这一切都是在您需要将这些对象作为参数传递的前提下编写的,原因有这些。如果您允许在与您的活动相同的班级中使用实例方法,那么Trevor的答案就更好了。
lbxTally
如果object
具有Items
属性,则不属于ListBox
类型。尝试将鼠标悬停在它上面,然后工具提示会告诉你它是什么。然后,您可以更改参数类型以进行调整。例如,如果它说object lbxTally
,您可以将参数从ListBox lbxTally
更改为Go to Definition
。
或者,您可以通过打开设计器并查看该特定对象,或右键单击对该控件的引用并单击object
并检查其声明方式来找到它。
当然,请注意,您必须检查原始方法中的类型。如果你对方法中已有的那个做了,它就不会工作。因为那已经是{{1}}。
答案 3 :(得分:0)
更改
object lbxTally
到
LabelBox lbxTally
或您正在使用的任何对象的名称。
对我来说,当我在表单上进行验证时,我会传递我要验证的控件,以便我可以更改其属性。所以我想在框中验证文本,我传入TextBox及其各自的Label。如果文本为空,则将标签更改为红色并标记布尔值。
我也在另一个问题中回答了这个问题:Passing data between class and form in C# using delegate parameter
答案 4 :(得分:0)
我不明白你为什么要将它重构为具有该签名的方法:
ref
关键字lbxTally
是object
类型的参数,它是最不具体的类型,您尝试访问特定于LabelBox
的属性。为简单起见,可读性和速度,将参数类型更改为LabelBox
PurchaseTotal()
的方法会让我假设正在进行大量购买。您可能希望反映您在该方法中实际执行的操作,即:UpdatePurchaseTotalLabels()
(是的,我知道这不是代码审查网站,但它的评论太长了)
答案 5 :(得分:0)
ref
关键字表示function can modify the parameter that is passed in。呼叫站点看起来像这样:
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal(ref dblSubtotal, ref dblTaxTotal, ref dblGrandTotal, lbxTally);
}
当然;这很傻。相反,您应该使用PurchaseTotal
内的类中的字段,并从其定义中删除static
修饰符:
void PurchaseTotal()
{
dblGrandTotal = dblSubtotal + dblTaxTotal;
lbxTally.Items.Add("");
lbxTally.Items.Add("");
lbxTally.Items.Add("Subtotal: " + dblSubtotal.ToString("C"));
lbxTally.Items.Add("Tax Total: " + dblTaxTotal.ToString("C"));
lbxTally.Items.Add("Grand Total: " + dblGrandTotal.ToString("C"));
}
您的呼叫网站将根据需要变为
private void btnEndSale_Click(object sender, EventArgs e)
{
PurchaseTotal();
}