我有一个带有6个文本框的简单GUI。
我有一个方法,它有7个参数,1个是长字符串,另外6个是文本框。该方法如下所示:
SetTextBoxesFromTokens(string s, string a, string b, string c, string d, string e, string f)
{
string[] tokens = s.Split('-');
a = tokens[0];
b = tokens[1];
c = tokens[2];
d = tokens[3];
e = tokens[4];
f = tokens[5];
}
我这样调用上面的方法,但它没有更新文本框:
SetTextBoxesFromTokens("1-2-3-4-5-6",
txtA.Text,txtB.Text,txtC.Text,txtD.Text,txtE.Text,txtF.Text);
答案 0 :(得分:3)
值通过值传递,即parameter passing of value types,即为参数创建新变量,并将文本框的文本复制到其中。参数值的变化不应该反映在文本框中。如果要更改函数中文本框的值,则传递TextBoxes对象而不是Text。
SetTextBoxesFromTokens(string s, TextBox txta, TextBox txtb, TextBox txtc, TextBox txtd, TextBox txte, TextBox txtf)
{
string[] tokens = s.Split('-');
txta.Text = tokens[0];
txtb.Text = tokens[1];
txtc.Text = tokens[2];
txtd.Text = tokens[3];
txte.Text = tokens[4];
txtf.Text = tokens[5];
}
答案 1 :(得分:2)
调用方法时,会创建字符串的副本。这意味着您不会将令牌数组分配给相应TextBox控件的.Text属性。您只需将值分配给在块结束时超出范围的内容。
根据您的要求,您将获得更合适的数据结构。
请考虑: -
SetTextBoxesFromTokens(Dictionary<string,TextBox> tokenDict)
{
tokenDict
.Keys
.ToList()
.ForEach(k => tokenDict[k].Text = k);
}
这样称呼: -
// Define key value pair set containing
// token
// textbox to set
var dict = new Dictionary<string,TextBox>()
{
{ "a", txtA },
{ "b", txtB },
{ "c", txtC },
{ "d", txtD },
{ "e", txtE },
{ "f", txtF }
};
SetTextBoxesFromTokens(dict);
使用此方法,Dictionary<string,TextBox>
参数(以及其中的TextBox
个对象)通过引用传递,并且您的方法不再与特定数量的TextBox
相关联,或者耦合string.Split
实施,如果没有足够的令牌,则会中断。