簡體   English   中英

是否可以將文本框作為參數傳遞?

[英]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;
}

運行代碼后,我希望將文本框文本更改為適當的值,相反,會在調用中收到有關文本框的此錯誤。

“ mscorlib.dll中發生了'System.InvalidCastException'類型的未處理的異常

其他信息:無法將類型為“ System.Windows.Forms.TextBox”的對象轉換為類型為“ 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";
}

您甚至可以返回TextBox:

TextBox MyFunc(string str)
{
    TextBox txt = new TextBox();
    txt.Text = str;
    return txt;
}

您正在嘗試將TextBox轉換為Int32:無法解析為Int32的Convert.ToInt32(tb_viewIngredient1) 您可以將其文本轉換為int32(如果它具有數字值並且可以解析),例如:

int.Parse(tb_viewIngredient1.Text)

要么

Conver.ToInt32(tb_viewIngredient1.Text)

問題是在兩個地方

MethodName( 字符串 theStringVariable,tb_1,tb_2);

私人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. 您可以將查找表用於過敏原而不是開關。 結果代碼更短/更簡單,並且運行速度更快。
  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";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM