是否可以将文本框作为参数传递?

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。相反,尝试将 TextBoxText 属性 传递给方法:

Convert.ToInt32(tb_viewIngredient1.Text)

问题在(Convert.ToInt32(tb_viewIngredient1),必须转换成:

(Convert.ToInt32(tb_viewIngredient1.Text)

我在这里看到三个不同的选项。根据您的需要,其中任何一个都比固定代码更好。所有这些都解决了两点:

  1. 您可以使用查询 table 来查找过敏原,而不是切换。生成的代码是 shorter/simpler 并且应该 运行 更快。
  2. 您遍历 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";
    }
}