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

#c# #textbox #parameter-passing

#c# #текстовое поле #передача параметров

Вопрос:

Я пытаюсь передать имя 2 текстовых полей в метод, чтобы он редактировал текст в них. Я пытался искать примеры в Интернете, но могу найти только людей, пытающихся передать текст textbox через.

Я пытался передать это, объявив текстовые поля в конструкторе метода.

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

После запуска кода я ожидаю, что текст текстового поля будет изменен на соответствующее значение, вместо этого я получаю эту ошибку о текстовых полях в вызове.

«Необработанное исключение типа ‘System.Исключение InvalidCastException’ произошло в mscorlib.dll

Дополнительная информация: Не удается привести объект типа ‘System.Windows.Формы.Текстовое поле ‘для ввода’ в систему.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;
}
  

Комментарии:

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

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

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

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

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

Ответ №1:

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

 void MyMethod(string str, TextBox txt)
{
     txt.Text = str   " some text from the method itself";
}
  

Вы даже можете вернуть текстовое поле:

 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)
  

Комментарии:

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

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

Ответ №2:

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

Имяметода(строка theStringVariable, tb_1, tb_2);

private void methodName(string theStringVariable, TextBox tb_name, TextBox tb_allergen) {

Ответ №3:

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

 Convert.ToInt32(tb_viewIngredient1.Text)
  

Ответ №4:

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

 (Convert.ToInt32(tb_viewIngredient1.Text)
  

Комментарии:

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

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

Ответ №5:

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

  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 amp;amp; 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 amp;amp; 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 = resu<
}
  

или

 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 amp;amp; ingredient.AllergenID < allergenTable.Length)
    {
        tb_allergen.Text = allergenTable[ingredient.AllergenID];
    }
    else
    {
        tb_allergen.Text = "N/A";
    }
}