Можно ли передавать текстовые поля в качестве параметра?

Я пытаюсь передать имя 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;
}

Этот private void MethodName(string, TextBox tb_name, TextBox tb_allergen) даже не скомпилируется. Кстати, вы можете передавать TextBox экземпляры методу так же, как и любому другому типу.

dcg 28.03.2019 23:09

@dcg действительно скомпилируется! Любой объект может быть передан в метод.

Amir Hajiha 28.03.2019 23:13

@AmirNo-Family Нет, не будет. Сигнатура метода не предоставляет имя для строкового параметра.

Joel Coehoorn 28.03.2019 23:14

Он не будет скомпилирован, потому что имя строкового параметра (1-й параметр) отсутствует. Но если не считать этой ошибки, с кодом все в порядке. Исключение должно произойти где-то еще. Пожалуйста, опубликуйте реальный код!

Olivier Jacot-Descombes 28.03.2019 23:14

@AmirNo-Family Внимательно посмотрите на синтаксис того, что я сказал, не будет компилироваться. Идентификатор ожидается после первого string

dcg 28.03.2019 23:15

ага не заметил! Правильно, ему нужно будет добавить имя переменной после этой строки.

Amir Hajiha 28.03.2019 23:16

Метод в моей программе компилируется, я просто забыл добавить имя для строки, когда упростил его, чтобы спросить здесь. Отредактировано для ясности.

Conor Datta 28.03.2019 23:20

в какой строке произошло исключение?

isaeid 28.03.2019 23:22

Исключение возникает при вызове метода

Conor Datta 28.03.2019 23:23
imgur.com/a/QoPUvrC
Conor Datta 28.03.2019 23:26

Эта ошибка не возникает из-за метода, который вы разместили

Deolus 28.03.2019 23:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
68
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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)

Я чувствую, что это похоже на то, что я пытался сделать, однако у меня только что возникла ошибка с сообщением «Невозможно преобразовать объект типа« System.Windows.Forms.TextBox »в тип« System.IConvertible »»

Conor Datta 28.03.2019 23:42

Большое спасибо за всю вашу помощь, не могу поверить, что я не понимал этого, если честно.

Conor Datta 28.03.2019 23:59

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

Имя Метода(нить theStringVariable, tb_1, tb_2);

private void имя_метода (строка StringVariable, TextBox tb_name, TextBox tb_allergen) {

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

Convert.ToInt32(tb_viewIngredient1.Text)

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

(Convert.ToInt32(tb_viewIngredient1.Text)

Я не могу поверить, что я смотрел на это в течение 2 часов, и это было так очевидно. Я был убежден, что эта часть была в порядке, и сосредоточился на другой. Большое спасибо вам и всем, кто пытался помочь мне в моей глупости

Conor Datta 28.03.2019 23:50

Спасибо, вы можете добавить баллы к полезным ответам. Другие друзья также ответили на это решение.

isaeid 28.03.2019 23:56

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

  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";
    }
}

Другие вопросы по теме