none
GridView批量更新,判断非空的最佳写法 RRS feed

  • 问题

  • ----在《演练:GridView批量更新》http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4  中,没有对于非空的判断,以《演练》中的例子为例,如果某一行有一列是空值,就会出错(NorthWind给出的数据库没有任何空值,因此偷偷绕开了这个问题),我增加了以下判断非空代码,虽然目前没处出错,但总感觉不妥。。。  

    ----

       -------------------代码----------------  

    protected bool IsRowModified(GridViewRow r)
        {
    //以上省略        
    Decimal currentMonthRentR01;
    DateTime currentDateTo;
    if ((((TextBox)r.FindControl("TextBox_MonthRentR01")).Text) != "")
                currentMonthRentR01 = Convert.ToDecimal(((TextBox)r.FindControl("TextBox_MonthRentR01")).Text);
            else currentMonthRentR01 = 0;
    
    if ((((TextBox)r.FindControl("TextBox_DateTo")).Text) != "")
                currentDateTo = Convert.ToDateTime(((TextBox)r.FindControl("TextBox_DateTo")).Text);
            else currentDateTo = '9999-12-31';
    //这个DateTo是Date类型的值,不知道怎么写合适的空值,只好写个最大值'9999-12-31',能运行,且点“更新”后的确是空值而不是'9999-12-31',但这个方法我总觉的不妥
    }



    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月19日 11:47

答案

全部回复

  • 1)尝试断点到((TextBox)r.FindControl("TextBox_DateTo")).Text去看看结果究竟是什么(空值的时候),然后把!=后面的那个内容替换成你调试的那个结果(我怀疑是" "空格)。

    2)实在不行,请使用IsNull先对各个字段进行过滤(比如:Select IsNull(字段1,""),……From xxx)。然后尝试使用你那个判断看看那。



       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月19日 12:03
  • 你说的第二个判断方法我还没见到过,而且应该还要加上比较复杂的判断吧?能否详细说一下呢?谢谢

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月19日 12:07
  • 有试过使用RequireFieldValidator控件吗?

    2012年3月19日 12:38
  • 以前用过RequireFieldValidator控件,但从来没在GridView的模板里面尝试过!  

    -

    -----在《演练:GridView批量修改》哪有合适放这个控件的位置呢?我以前只是把RequireFieldValidator控件放在某个TextBox的旁边,进行简单的判断。从来没在GridView中嵌套(不知道‘嵌套’这个词使用的准不准确)使用过这个控件。 


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月19日 13:33
  • 用法还是一样,只是把RequireFieldValidator的ControlToValidate指向同一个ItemTemplate的TextBox的ID即可

    如下:

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID"
                    InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" />
                <asp:TemplateField HeaderText="EmployeeName" SortExpression="EmployeeName">
                    <ItemTemplate>
                        <asp:RequiredFieldValidator ErrorMessage="必填" ControlToValidate="txt_EmployeeName" ForeColor="Red"
                            runat="server" />
                        <asp:TextBox ID="txt_EmployeeName" runat="server" Text='<%# Bind("EmployeeName") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>


    2012年3月19日 14:35
  •     感谢您的及时回复!但您是让RequireFieldValidator控件来保证TextBox不为空值,而实际上我的TextBox经常会有空值的!  --

    -

    ---我只是想做一个对TextBox是否空值的判断,如果非空则输入TextBox中的值,如果是空,则还是空。请您仔细看看我一楼的帖子的这一段,就明白了  。

    -- 

    -“没有对于非空的判断,以《演练》中的例子为例,如果某一行有一列是空值,就会出错NorthWind给出的数据库没有任何空值,因此偷偷绕开了这个问题),我增加了以下判断非空代码,虽然目前没处出错,但总感觉不妥。。。  


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月19日 14:52
  • 或許你可以利用TryParse搭配Trim來協助判斷是否有空值並轉換成適合的型別。

    有興趣不妨參考下列的程式碼:

    decimal d = 0;
    string s = "123";
    decimal.TryParse(s.Trim(), out d);
    Console.WriteLine(d);
    
    s = " ";
    decimal.TryParse(s.Trim(), out d);
    Console.WriteLine(d);
    
    DateTime dt;
    string sd = "1234/12/32";
    DateTime.TryParse(sd, out dt);
    Console.WriteLine(dt);
    
    sd = "1234/12/31";
    DateTime.TryParse(sd.Trim(), out dt);
    Console.WriteLine(dt);

    執行結果:


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年3月19日 22:35
  • 你说的第二个判断方法我还没见到过,而且应该还要加上比较复杂的判断吧?能否详细说一下呢?

    第二种办法并不复杂啊,我的意思是你原来的数据表中不是有Null字段么,现在要避免这个对吧?你的方法就是用IsNull把可能含有Null的字段用默认值(非Null)取代呗。比如:

    Select IsNull(MyDateTime,getdate()),其它字段…… from xxx

    这样依赖,MyDateTime字段中一旦为空,那么就会被默认的getdate当前时间所取代,这样可以避免空值出现的情况。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月20日 1:12
  • DateTime currentDateTo;
    DateTime.TryParse((((TextBox)r.FindControl("TextBox_DateTo")).Text ).Trim(), out 
    currentDateTo
    );

    依葫芦画瓢,这样写么???第一次见到这种写法,还不明白这一句哪里有判断是否空值的功能,

    能否详细 说明一下!?谢谢


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月20日 5:45
  • 这样的,如果转化抛出异常(也就是无法转化到一个日期,那么TryParse返回false,currentDateTo保留其原始数据;否则返回true,currentDateTo就是转换后的内容)。一般建议放入if语句作为判断用。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月20日 5:49
  • 那我写的这段代码对不对呢?

    DateTime currentDateTo;

    DateTime.TryParse((((TextBox)r.FindControl("TextBox_DateTo")).Text ).Trim(), out

    currentDateTo

    );

    第一次见,真不知道怎么写

     

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月20日 15:14
  • 可以,不过建议currentDateTo先给予一个默认值,比如当前系统时间:

    DateTime currentDateTo = DateTime.Now;

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月21日 1:10
  • 我暂时还未测试,完整的代码应该是:  


    DateTime currentDateTo = DateTime.Now; 


    DateTime.TryParse((((TextBox)r.FindControl("TextBox_DateTo")).Text ).Trim(), out 


    currentDateTo
    );  


    这样就可以当 控件 TextBox_DateTo 有内容时,就输入他的内容,没有内容(null)时就什么都不做,是吧?

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月21日 5:48
  • 我暂时还未测试,完整的代码应该是:  


    DateTime currentDateTo = DateTime.Now; 


    DateTime.TryParse((((TextBox)r.FindControl("TextBox_DateTo")).Text ).Trim(), out 


    currentDateTo
    );  


    这样就可以当 控件 TextBox_DateTo 有内容时,就输入他的内容,没有内容(null)时就什么都不做,是吧?

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    不是。当TextBox是null的时候,转换失败,自动以currentDateTo原来初始化那个数值为准。

    如果你希望在null的时候什么也不做,请把Update按钮转化成Template(模板形式),然后在GridView_RowUpdating事件中做如下处理——前提条件,你那个DateTime必须允许为空(Null)。

    if(DateTime.TryParse((((TextBox)GridView1.Rows[e.RowIndex].FindControl("TextBox_DateTo")).Text ).Trim(), out currentDateTo))
    {
       e.NewValues["你的时间绑定字段"]=curentDateTo;
    }
    else
    {
       e.NewValues["你的时间绑定字段"]=DBNull.Value;
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月21日 6:30
  •     谢谢您耐心的回复!代码这一块我基本明白了!但是您说的“如果你希望在null的时候什么也不做,请把Update按钮转化成Template(模板形式),”这句话我没懂,哪里有什么Update按钮啊,我是参照《演练:GridView批量更新》http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4  做的,没看见什么“Update按钮”啊!!!您说的是不是GridView自带的“编辑”,要把“编辑”转化为模板???

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2012年3月21日 12:13
  •     谢谢您耐心的回复!代码这一块我基本明白了!但是您说的“如果你希望在null的时候什么也不做,请把Update按钮转化成Template(模板形式),”这句话我没懂,哪里有什么Update按钮啊,我是参照《演练:GridView批量更新》http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4  做的,没看见什么“Update按钮”啊!!!您说的是不是GridView自带的“编辑”,要把“编辑”转化为模板???

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    哦,是的。编辑列请转化成模板。因为编辑列在点击之后才会显示“更新”、“取消”按钮。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月22日 5:46