#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:
Я вижу здесь три разных варианта. Любое из них было бы даже лучше, чем фиксированный код, в зависимости от ваших потребностей. Все они адресуют две точки:
- Вы можете использовать таблицу поиска для аллергенов, а не переключатель. Результирующий код короче / проще и должен выполняться быстрее.
- Вы перебираете каждый элемент в
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";
}
}