TextBox值是不是从外部方法更新的?

时间:2012-11-06 17:00:28

标签: c# winforms .net-4.0

我有一个带有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);

2 个答案:

答案 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实施,如果没有足够的令牌,则会中断。