是否可以将文本框作为参数传递?
Is it possible to pass textboxes as a parameter?
我试图将 2 个文本框的名称传递给一个方法,以便它编辑其中的文本。我曾尝试在网上寻找示例,但只能找到试图通过文本框文本传递的人。
我尝试通过在方法构造函数中声明文本框来传递它。
MethodName(string text, tb_1, tb_2);
private void MethodName(string str, TextBox tb_name, TextBox tb_allergen)
{
string ingredientName = "";
string ingredientAllergen = "";
//code to change strings//
tb_name.Text = ingredientName;
tb_allergen.Text = ingredientAllergen;
}
在 运行 代码之后,我希望将文本框文本更改为适当的值,但我在调用中收到有关文本框的错误。
"An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: Unable to cast object of type 'System.Windows.Forms.TextBox' to type 'System.IConvertible'"
真的很抱歉,如果有一个简单的解决方法,但请指出正确的方向。提前致谢。
真实代码
ingredientDBAccess ingredientDBA = new ingredientDBAccess(db);
populateBoxesWithIngredientResults( ingredientDBA.getIngredientsFromID(Convert.ToInt32(tb_viewIngredient1)), tb_viewIngredient1, tb_viewAllergen1);
private void populateBoxesWithIngredientResults(List<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
string ingredientName = "";
string ingredientAllergen = "";
foreach (ingredient ingredient in ingredientList)
{
string name = Convert.ToString(ingredient.IngredientName);
ingredientName = name;
string allergen = "N/A";
switch (ingredient.AllergenID)
{
case 0:
allergen = "N/A";
break;
case 1:
allergen = "Nut";
break;
case 2:
allergen = "Gluten";
break;
case 3:
allergen = "Dairy";
break;
case 4:
allergen = "Egg";
break;
}
ingredientAllergen = allergen;
}
tb_name.Text = ingredientName;
tb_allergen.Text = ingredientAllergen;
}
是的,这是可能的:
void MyMethod(string str, TextBox txt)
{
txt.Text = str + " some text from the method itself";
}
您甚至可以 return 一个文本框:
TextBox MyFunc(string str)
{
TextBox txt = new TextBox();
txt.Text = str;
return txt;
}
您正在尝试将 TextBox 转换为 Int32:
Convert.ToInt32(tb_viewIngredient1)
无法解析为 Int32。您可以将它的文本转换为 int32(如果它具有数值并且可以解析),例如:
int.Parse(tb_viewIngredient1.Text)
或
Conver.ToInt32(tb_viewIngredient1.Text)
问题出在两个地方
MethodName(string theStringVariable, tb_1, tb_2);
private void MethodName(string theStringVariable, TextBox tb_name, TextBox tb_allergen)
{
Convert.ToInt32(tb_viewIngredient1)
将抛出异常,因为您正试图将 TextBox
控件转换为 int
。相反,尝试将 TextBox
的 Text
属性 传递给方法:
Convert.ToInt32(tb_viewIngredient1.Text)
问题在(Convert.ToInt32(tb_viewIngredient1)
,必须转换成:
(Convert.ToInt32(tb_viewIngredient1.Text)
我在这里看到三个不同的选项。根据您的需要,其中任何一个都比固定代码更好。所有这些都解决了两点:
- 您可以使用查询 table 来查找过敏原,而不是切换。生成的代码是 shorter/simpler 并且应该 运行 更快。
- 您遍历
ingredientList
中的每个项目,但文本框只会保留列表中最后一项的数据。要么只看最后一项(不需要循环),要么使用列表中的所有项目(即:创建 csv 字符串)。循环是浪费的并且使代码复杂化。
.
private void populateBoxesWithIngredientResults(IEnumerable<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
string nameDelimiter = "";
string allergenDelimiter = "";
string ingredients = "";
string allergens = "";
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
foreach (ingredient ingredient in ingredientList)
{
//Is Convert.ToString() really needed here?
// I feel like ingredient.IngredientName is ALREADY A STRING
ingredients += delimiter + Convert.ToString(ingredient.IngredientName);
nameDelimiter = ",";
if (ingredient.AllergenID > 0 && ingredient.AllergenID < allergenTable.Length)
{
allergens += allergenDelimiter + allergenTable[ingredient.AllergenID];
allergenDelimiter = ",";
}
}
if (allergens == "") allergens = "N/A";
tb_name.Text = ingredients;
tb_allergen.Text = allergens;
}
或
private void populateBoxesWithIngredientResults(IEnumerable<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
tb_name.Text = string.Join(",", ingredientList.Select(i => i.IngredientName));
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
var allergens = ingredientList.
Select(i => (i.AllergenID > 0 && i.AllergenID < allergenTable.Length)? allergenTable[i.AllergenID]):"").
Where(i => i.Length > 0);
var result = string.Join(",", allergens);
if (string.IsNullOrEmpty(result)) result = "N/A";
tb_allergen.Text = result;
}
或
private void populateBoxesWithIngredientResults(List<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
if (ingredientList.Length == 0)
{
tb_name.Text = "";
tb_allergen.Text = "";
}
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
var ingredient = ingredientList[ingredientList.Count - 1];
tb_name.Text = ingredient.IngredientName;
if (ingredient.AllergenID >= 0 && ingredient.AllergenID < allergenTable.Length)
{
tb_allergen.Text = allergenTable[ingredient.AllergenID];
}
else
{
tb_allergen.Text = "N/A";
}
}
我试图将 2 个文本框的名称传递给一个方法,以便它编辑其中的文本。我曾尝试在网上寻找示例,但只能找到试图通过文本框文本传递的人。
我尝试通过在方法构造函数中声明文本框来传递它。
MethodName(string text, tb_1, tb_2);
private void MethodName(string str, TextBox tb_name, TextBox tb_allergen)
{
string ingredientName = "";
string ingredientAllergen = "";
//code to change strings//
tb_name.Text = ingredientName;
tb_allergen.Text = ingredientAllergen;
}
在 运行 代码之后,我希望将文本框文本更改为适当的值,但我在调用中收到有关文本框的错误。
"An unhandled exception of type 'System.InvalidCastException' occurred in mscorlib.dll
Additional information: Unable to cast object of type 'System.Windows.Forms.TextBox' to type 'System.IConvertible'"
真的很抱歉,如果有一个简单的解决方法,但请指出正确的方向。提前致谢。
真实代码
ingredientDBAccess ingredientDBA = new ingredientDBAccess(db);
populateBoxesWithIngredientResults( ingredientDBA.getIngredientsFromID(Convert.ToInt32(tb_viewIngredient1)), tb_viewIngredient1, tb_viewAllergen1);
private void populateBoxesWithIngredientResults(List<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
string ingredientName = "";
string ingredientAllergen = "";
foreach (ingredient ingredient in ingredientList)
{
string name = Convert.ToString(ingredient.IngredientName);
ingredientName = name;
string allergen = "N/A";
switch (ingredient.AllergenID)
{
case 0:
allergen = "N/A";
break;
case 1:
allergen = "Nut";
break;
case 2:
allergen = "Gluten";
break;
case 3:
allergen = "Dairy";
break;
case 4:
allergen = "Egg";
break;
}
ingredientAllergen = allergen;
}
tb_name.Text = ingredientName;
tb_allergen.Text = ingredientAllergen;
}
是的,这是可能的:
void MyMethod(string str, TextBox txt)
{
txt.Text = str + " some text from the method itself";
}
您甚至可以 return 一个文本框:
TextBox MyFunc(string str)
{
TextBox txt = new TextBox();
txt.Text = str;
return txt;
}
您正在尝试将 TextBox 转换为 Int32:
Convert.ToInt32(tb_viewIngredient1)
无法解析为 Int32。您可以将它的文本转换为 int32(如果它具有数值并且可以解析),例如:
int.Parse(tb_viewIngredient1.Text)
或
Conver.ToInt32(tb_viewIngredient1.Text)
问题出在两个地方
MethodName(string theStringVariable, tb_1, tb_2);
private void MethodName(string theStringVariable, TextBox tb_name, TextBox tb_allergen) {
Convert.ToInt32(tb_viewIngredient1)
将抛出异常,因为您正试图将 TextBox
控件转换为 int
。相反,尝试将 TextBox
的 Text
属性 传递给方法:
Convert.ToInt32(tb_viewIngredient1.Text)
问题在(Convert.ToInt32(tb_viewIngredient1)
,必须转换成:
(Convert.ToInt32(tb_viewIngredient1.Text)
我在这里看到三个不同的选项。根据您的需要,其中任何一个都比固定代码更好。所有这些都解决了两点:
- 您可以使用查询 table 来查找过敏原,而不是切换。生成的代码是 shorter/simpler 并且应该 运行 更快。
- 您遍历
ingredientList
中的每个项目,但文本框只会保留列表中最后一项的数据。要么只看最后一项(不需要循环),要么使用列表中的所有项目(即:创建 csv 字符串)。循环是浪费的并且使代码复杂化。
.
private void populateBoxesWithIngredientResults(IEnumerable<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
string nameDelimiter = "";
string allergenDelimiter = "";
string ingredients = "";
string allergens = "";
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
foreach (ingredient ingredient in ingredientList)
{
//Is Convert.ToString() really needed here?
// I feel like ingredient.IngredientName is ALREADY A STRING
ingredients += delimiter + Convert.ToString(ingredient.IngredientName);
nameDelimiter = ",";
if (ingredient.AllergenID > 0 && ingredient.AllergenID < allergenTable.Length)
{
allergens += allergenDelimiter + allergenTable[ingredient.AllergenID];
allergenDelimiter = ",";
}
}
if (allergens == "") allergens = "N/A";
tb_name.Text = ingredients;
tb_allergen.Text = allergens;
}
或
private void populateBoxesWithIngredientResults(IEnumerable<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
tb_name.Text = string.Join(",", ingredientList.Select(i => i.IngredientName));
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
var allergens = ingredientList.
Select(i => (i.AllergenID > 0 && i.AllergenID < allergenTable.Length)? allergenTable[i.AllergenID]):"").
Where(i => i.Length > 0);
var result = string.Join(",", allergens);
if (string.IsNullOrEmpty(result)) result = "N/A";
tb_allergen.Text = result;
}
或
private void populateBoxesWithIngredientResults(List<ingredient> ingredientList, TextBox tb_name, TextBox tb_allergen)
{
if (ingredientList.Length == 0)
{
tb_name.Text = "";
tb_allergen.Text = "";
}
var allergenTable = {"N/A", "Nut", "Gluten", "Dairy", "Egg"};
var ingredient = ingredientList[ingredientList.Count - 1];
tb_name.Text = ingredient.IngredientName;
if (ingredient.AllergenID >= 0 && ingredient.AllergenID < allergenTable.Length)
{
tb_allergen.Text = allergenTable[ingredient.AllergenID];
}
else
{
tb_allergen.Text = "N/A";
}
}