Я пытаюсь передать имя 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;
}
@dcg действительно скомпилируется! Любой объект может быть передан в метод.
@AmirNo-Family Нет, не будет. Сигнатура метода не предоставляет имя для строкового параметра.
Он не будет скомпилирован, потому что имя строкового параметра (1-й параметр) отсутствует. Но если не считать этой ошибки, с кодом все в порядке. Исключение должно произойти где-то еще. Пожалуйста, опубликуйте реальный код!
@AmirNo-Family Внимательно посмотрите на синтаксис того, что я сказал, не будет компилироваться. Идентификатор ожидается после первого string
ага не заметил! Правильно, ему нужно будет добавить имя переменной после этой строки.
Метод в моей программе компилируется, я просто забыл добавить имя для строки, когда упростил его, чтобы спросить здесь. Отредактировано для ясности.
в какой строке произошло исключение?
Исключение возникает при вызове метода
Эта ошибка не возникает из-за метода, который вы разместили





Да, это возможно:
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 »»
Большое спасибо за всю вашу помощь, не могу поверить, что я не понимал этого, если честно.
Проблема в двух местах
Имя Метода(нить 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 часов, и это было так очевидно. Я был убежден, что эта часть была в порядке, и сосредоточился на другой. Большое спасибо вам и всем, кто пытался помочь мне в моей глупости
Спасибо, вы можете добавить баллы к полезным ответам. Другие друзья также ответили на это решение.
Здесь я вижу три разных варианта. Любой из них будет даже лучше, чем фиксированный код, в зависимости от ваших потребностей. Все они касаются двух моментов:
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";
}
}
Этот
private void MethodName(string, TextBox tb_name, TextBox tb_allergen)даже не скомпилируется. Кстати, вы можете передаватьTextBoxэкземпляры методу так же, как и любому другому типу.