2013-04-10 2 views
3

Это первый случай, с которым я столкнулся - конечно, это не так много, но тем не менее мне нужно проконсультироваться с коллективом в качестве моих поисков, пока показал, что это можно сделать, я не могу это обработать.Nullable (int?) Продолжает бросать исключение, отличное от нуля

Проблема заключается в том, что если пользователь покидает текстовое поле пустым, C# автоматически вводит ноль в postback и в базу данных. Я просто хочу, чтобы текстовое поле осталось пустым.

У меня есть класс есть свойство объявляется:

private int? _PageNumber = null; 

public int? PageNumber 
{ 
    get { return _PageNumber; } 
    set { _PageNumber = value; } 
} 

в моем файле кода у меня есть:

if (tbPageNumber.Text != "") 
     ia.PageNumber = Convert.ToInt32(tbPageNumber.Text); 
    else 
     ia.PageNumber = null; 

и это, где я получаю исключение:

CS0037: Cannot convert null to 'int' because it is a non-nullable value type 

Так что я думал, что если я не могу изменить тип, возможно, я могу изменить выход. Так я думал, что, возможно, я могу притворяться его, помещая это в текст имущества texbox в:

'<%# Eval("PageNumber") == 0 ? null:Eval("PageNumber") %>' 

Это бросает CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int' исключение.

Почему так чертовски упрямо ???

+4

Это не похоже на исключение - это похоже на проблему с компиляцией. Можете ли вы воспроизвести это в коротком, но полном консольном приложении, чтобы задача ASP.NET не отображалась? –

+0

CS0037 больше похож на ошибку компилятора, чем исключение. Есть действительно большая разница. –

ответ

1

Ладно люди, ты собираешься убить меня за это.

Проблема заключалась в том, что класс, в котором ia.PageNumber объявлен в отдельном проекте в решении, и по какой-то причине он не скомпилировал, следовательно, комментарии о проблемах с компилятором.

Это первое такое решение с несколькими проектами, с которыми я работал, и у меня не было оснований думать о компиляции отдельных проектов (я использую Visual Studio 2010).

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

4

Я хотел бы попробовать следующее:

if (!string.IsNullOrEmpty(tbPageNumber.Text)) 
    ia.PageNumber = Convert.ToInt32(tbPageNumber.Text); 
else 
    ia.PageNumber = null; 

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

+2

Но проблема не в 'null' или' empty' string, это все о том, как сохранить 'null' в типе данных' int'. – Shaharyar

+0

Проблема с этим решением заключается в том, что 'OP' получает ошибку компилятора. Суть в том, что 'ia.PageNumber' ** не является **' int? '. –

+0

@ jvanh1, это буквально невозможно. Пожалуйста, см. Мой ответ. –

0

Попробуйте это:

ia.PageNumber = (int?)null; 

Edit: я думал о другой вопрос .. ошибка указывает на то, что ia.PageNumber является int, не int?, несмотря на код примера.

+1

Какая разница? –

+0

Я пробовал это раньше - не работал. – Risho

5

Чтобы быть очень прямо вперед, нет никакого способа, которым ia.PageNumber ссылается на определение предоставленной вами, потому что следующий код не только собирает, и работает, но выписывает Setting to NULL.:

private int? _PageNumber = null; 

public int? PageNumber 
{ 
    get { return _PageNumber; } 
    set { _PageNumber = value; } 
} 

if (string.Empty != "") 
{ 
    PageNumber = Convert.ToInt32(string.Empty); 
    Console.WriteLine("Setting to value."); 
} 
else 
{ 
    PageNumber = null; 
    Console.WriteLine("Setting to NULL."); 
} 

дно что ia.PageNumber не является int?или _PageNumber не является int?. Для дальнейшего бетону своей позиции, следующий код:

PageNumber = Convert.ToInt32(" "); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

кидает ожидаемое исключение:

Входной строка не была в правильном формате.

так что проблема также не может быть дополненной строкой.И, наконец, бетон моей позиции следующий код:

PageNumber = Convert.ToInt32(""); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

бросает ожидаемое исключение:

Входная строка не была в правильном формате.

поэтому проблема не может быть пустой строкой. И далее конкретизировать эту позицию, основанную на замечании jadarnel27, что вы могли бы быть превращающим null, что на самом деле преуспевает, как ожидается, следующий код:

PageNumber = Convert.ToInt32(null); 
Console.WriteLine("Setting to value {0}.", PageNumber); 

на самом деле, компилирует, бегает, и не проливает execption. Он выводит строку Setting to value 0., как и ожидалось.

+0

Если tbPageNumber.Текст имеет значение null, тогда код OPs вызывает Convert.ToInt32 на нулевом значении, что похоже на проблему, с которой он сталкивается. Его проверка if не учитывает значение null, только для пустого. – jadarnel27

+0

@ jadarnel27, это на самом деле не правильно, см. Мое редактирование. –

+0

Ах. Виноват. Я думал, что вспомнил, что преобразование null не работает, но я вижу, что из документов это неверно. – jadarnel27

0

CS0019: оператор '==' не может быть применен к операндам типа 'объекта' и 'Int'

Попробуйте 0 до "0"

'<%# Eval("PageNumber") == "0" ? 0:Eval("PageNumber") %>' 

Может не конвертировать нуль в «INT», потому что это ненулевое значение типа

не используйте нуль в pagenumber .Because pagenumber свойства получить единственное число values.But нуль не целое число. Таким образом, вы получите это выше error.But теперь я изменился с нулевого до 0

+0

Я не хочу показывать нуль. – Risho

2

Я сделал метод расширения для этого, который помогает мне много с этими преобразованиями веба-связанными строк в случае типов значений:

public static class ExtensionMethods 
{ 
    public static T As<T>(this string input, T fallback = default(T), 
          IFormatProvider provider = null) 
    { 
     var type = Nullable.GetUnderlyingType(typeof(T)); 
     if (type == null) 
      type = typeof(T); 
     T result; 
     try 
     { 
      result = (T)Convert.ChangeType(input, type, provider); 
     } 
     catch(Exception) 
     { 
      result = fallback; 
     } 
     return result; 
    } 
} 

И использовать его как это:

ia.PageNumber = tbPageNumber.Text.As<int>(); 
ia.PageNumber = tbPageNumber.Text.As<int?>(); 
ia.PageNumber = tbPageNumber.Text.As<int?>(10);