Можно ли передавать текстовые поля в качестве параметра? - PullRequest
2 голосов
/ 29 марта 2019

Я пытаюсь передать имя 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необработанное исключение типа «System.InvalidCastException» произошло в mscorlib.dll

Дополнительная информация: невозможно привести объект типа «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;
}

Ответы [ 5 ]

3 голосов
/ 29 марта 2019

Да, это возможно:

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: Convert.ToInt32(tb_viewIngredient1), который не может быть проанализирован дляInt32.Вы можете преобразовать его текст в int32 (если он имеет числовое значение и может быть проанализирован), например:

int.Parse(tb_viewIngredient1.Text)

или

Conver.ToInt32(tb_viewIngredient1.Text)
0 голосов
/ 29 марта 2019

Я вижу три разных варианта здесь.Любой из них будет даже лучше, чем фиксированный код, в зависимости от ваших потребностей.Все они касаются двух точек:

  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";
    }
}
0 голосов
/ 29 марта 2019

Проблема в (Convert.ToInt32(tb_viewIngredient1), вы должны преобразовать его в:

(Convert.ToInt32(tb_viewIngredient1.Text)
0 голосов
/ 29 марта 2019

Convert.ToInt32(tb_viewIngredient1) вызовет исключение, потому что вы пытаетесь преобразовать TextBox элемент управления в int.Вместо этого попробуйте передать свойство Text TextBox методу:

Convert.ToInt32(tb_viewIngredient1.Text)
0 голосов
/ 29 марта 2019

Проблема в двух местах

MethodName ( строка theStringVariable, tb_1, tb_2);

private void MethodName (строка theStringVariable , TextBox tb_name, TextBox tb_allergen) {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...