这是我第一次遇到这种情况 - 当然这并不是很多,但我从不需要与集体协商作为我的搜索,同时表明它可以完成,我不是能够解决它。
问题是,如果用户将文本框留空,C#会自动在回发上输入零并进入数据库。我只想将文本框留空。
我在那里宣布了一个属性:
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的text属性中伪造它:
'<%# Eval("PageNumber") == 0 ? null:Eval("PageNumber") %>'
这会抛出CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int'
例外。
为什么这么该死的顽固?
答案 0 :(得分:5)
要非常直接,ia.PageNumber
无法引用您提供的定义,因为以下代码不仅编译,并运行,而且写出{{1 }}:
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
或 _PageNumber不是int?
。为了进一步具体化我的立场,以下代码:
int?
抛出预期的异常:
输入字符串的格式不正确。
所以问题也不能是填充字符串。最后具体我的立场,以下代码:
PageNumber = Convert.ToInt32(" ");
Console.WriteLine("Setting to value {0}.", PageNumber);
抛出预期的异常:
输入字符串的格式不正确。
因此问题也不能是空字符串。根据{{1}}您可能正在转换PageNumber = Convert.ToInt32("");
Console.WriteLine("Setting to value {0}.", PageNumber);
的评论进一步具体说明这个位置,实际上是按预期成功的,以下代码:
jadarnel27
实际上,编译,运行并且不会执行任何操作。它按预期输出字符串null
。
答案 1 :(得分:4)
我会尝试以下方法:
if (!string.IsNullOrEmpty(tbPageNumber.Text))
ia.PageNumber = Convert.ToInt32(tbPageNumber.Text);
else
ia.PageNumber = null;
空字符串和空字符串是两个不同的东西,因此具有空值的字符串可能会在您的代码中滑落。
答案 2 :(得分: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);
答案 3 :(得分:1)
好的人,你会为此杀了我。
问题在于,在解决方案的单独项目中声明了ia.PageNumber
的类,并且由于某种原因它没有编译,因此有关编译器时间问题的注释。
这是我第一次使用多个项目的解决方案,我没有理由去编译单个项目(我使用的是Visual Studio 2010)。
嗯,经验教训。非常感谢所有贡献者。
答案 4 :(得分:0)
试试这个:
ia.PageNumber = (int?)null;
编辑:我在想一个不同的问题..错误表明ia.PageNumber
是int
,而不是int?
,尽管提供了示例代码。
答案 5 :(得分:0)
CS0019:运算符'=='无法应用于'object'和'int'类型的操作数
尝试将此0设为“0”
'<%# Eval("PageNumber") == "0" ? 0:Eval("PageNumber") %>'
无法将null转换为'int',因为它是一个不可为空的值类型
不要在pagenumber
中使用null。因为pagenumber
属性只获取整数值。但是null不是整数。所以你得到了上面的错误。但是现在我从null更改为0