3

这是我第一次遇到这种情况-当然这并没有太多意义,但是我需要与集体协商,因为我的搜索表明可以完成,但我无法工作出来。

问题是,如果用户将文本框留空,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'异常。

怎么这么固执???

4

6 回答 6

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

实际上,编译、运行并且不抛出任何执行。Setting to value 0.它按预期输出字符串。

于 2013-04-10T18:11:01.940 回答
4

我会尝试以下方法:

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

空字符串和空字符串是两个不同的东西,因此具有空值的字符串可能会在您的代码中溜走。

于 2013-04-10T18:08:12.393 回答
3

我为此做了一个扩展方法,在值类型的情况下,它对这些与 Web 相关的字符串转换有很大帮助:

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);
于 2013-04-10T19:11:29.920 回答
2

好吧,伙计们,你们会为此杀了我的。

问题是ia.PageNumber在解决方案的单独项目中声明的类由于某种原因它没有编译,因此有关编译器时问题的评论。

这是我使用过的多个项目的第一个此类解决方案,我没有理由考虑编译单个项目(我使用 Visual Studio 2010)。

嗯,吸取了教训。非常感谢所有做出贡献的人。

于 2013-04-10T19:40:14.230 回答
0

CS0019:运算符“==”不能应用于“object”和“int”类型的操作数

试试这个 0 到“0”

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

无法将 null 转换为“int”,因为它是不可为 null 的值类型

不要在中使用null。pagenumber因为该pagenumber属性只获取整数值。但null不是整数。所以你得到了上面的错误。但现在我从 null 更改为 0

于 2013-04-10T18:12:32.517 回答
0

尝试这个:

ia.PageNumber = (int?)null;

编辑:我在考虑一个不同的问题。尽管提供了示例代码,但该错误表明它ia.PageNumber是一个int,而不是一个。int?

于 2013-04-10T18:11:01.273 回答