none
如何调整转GridView中化为模板的控件的显示模式 RRS feed

  • 问题

  •       GridView 的DataFormatString 可以设置控件的显示格式,例如{0:d}显示短日期模式,现在我把控件转换为模板,DataFormatString就不能用了,前台的日期就会显示成2012-3-26 0:00:00,要如何让模板页显示成短日期呢?其他的Decimal、百分比的显示模式我也想了解。


        下面这段代码是我仿照《演练:GridView批量更新》http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4   写的一个列的代码,这个列是用Label显示的,我想把他调成短日期该怎么写呢?另外,如果这个列是用TextBox显示,又该怎么写呢?不管是<EditItemTemplate>还是<ItemTemplate>我都改成短日期,又该怎么写呢?呵呵!请大大们帮忙看一下。


    <asp:TemplateField HeaderText="LeaseDateFromR" SortExpression="LeaseDateFromR">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox_LeaseDateFromR" runat="server" 
                                        Text='<%# Bind("LeaseDateFromR") %>' ></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="Label_LeaseDateFromR" runat="server" 
                                        Text='<%# Bind("LeaseDateFromR") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>


    下面是我以前得到过一段代码提示,但我尝试了没成功,
    还有一个方法,把这个列转化成Template(模板列)。然后注意我黑色部分——


    <asp:Template HeaderText="你的列名">


        <ItemTemplate>


                <%#string.Format("{0:#0.0}",Eval("绑定的列名"))%>


        </ItemTemplate>


    </asp:Template>


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


    2012年3月27日 4:10

全部回复

  • 短日期:<asp:TextBox runat="server" id="myTXT" Text='<%# Eval("字段","{0:yyyy/MM/dd}")%>' />

    其他Eval格式參考:http://www.dotblogs.com.tw/vipcase/archive/2010/08/04/17004.aspx


    2012年3月27日 4:44
  • 首先说明,你这个并不是短日期,你的ItemTemplate是格式化小数数字的做法,而正确写法(或者是Shadow And Happy的说法)。

    <%#string.Format("{0:d}",Eval("绑定的列名"))%>

    或者采用BoundField方式:

     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
                EnableModelValidation="True" OnRowEditing="GridView1_RowEditing">
                <Columns>
                    <asp:BoundField HeaderText="我的日期" DataField="MyDateTime" DataFormatString="{0:d}" />
                    <asp:CommandField ShowEditButton="True" />
                </Columns>
            </asp:GridView>

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

    2012年3月27日 7:02
  •     

        我尝试了shadow提供的方式,短日期:<asp:TextBox runat="server" id="myTXT" Text='<%# Eval("字段","{0:yyyy/MM/dd}")%>' />


    可以正确显示2012-12-31的格式了。高兴之余在GridView另一个列输入了一个数字,然后傻眼了。看来还是要结合《演练:GridView批量修改》具体例子具体分析,这一次遇到的问题是:我在MonthRent01 这个列输入了一个数字, 所有LeaseDateToR列的日期都被清空了。。。然后我又尝试在LeaseDateToR这个列输入日期,点击确定后该列再次被清空。我感觉这个问题比较复杂,下面是《演练:GridView批量修改》的地址、前后台代码以及在MonthRent01输入数字前后的效果对比。请各位大大帮忙看看,我快崩溃了。。。

        用了Wei Dong 的方法 也是同样的效果。。。。。
    =======地址=========
    http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4 


    ============前台========================

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default13.aspx.cs" Inherits="Default13" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
        <table class="style1">
            <tr>
                <td>
                    <asp:Button ID="UpdateButton" runat="server" onclick="UpdateButton_Click" 
                        Text="Button" />
                    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
                        AutoGenerateColumns="False" DataKeyNames="PRID" DataSourceID="SqlDataSource1" 
                        onrowdatabound="GirdView1_RowDataBound" PageSize="5">
                        <Columns>
                            <asp:TemplateField HeaderText="ReceivableID" SortExpression="ReceivableID">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ReceivableID") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ReceivableID") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="PropertyIDR" SortExpression="PropertyIDR">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("PropertyIDR") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("PropertyIDR") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="PropertyCRAR" SortExpression="PropertyCRAR">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("PropertyCRAR") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("PropertyCRAR") %>'></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="LeaseDateToR" SortExpression="LeaseDateToR">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox4" runat="server" Text='<%#Eval("LeaseDateToR","{0:yyyy/MM/dd}") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:TextBox ID="TextBox_LeaseDateToR" runat="server" 
                                        Text='<%#Eval("LeaseDateToR","{0:yyyy/MM/dd}") %>'></asp:TextBox>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="MonthRentR01" SortExpression="MonthRentR01">
                                <EditItemTemplate>
                                    <asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("MonthRentR01") %>'></asp:TextBox>
                                </EditItemTemplate>
                                <ItemTemplate>
                                    <asp:TextBox ID="TextBox_MonthRentR01" runat="server" 
                                        Text='<%# Bind("MonthRentR01") %>'></asp:TextBox>
                                </ItemTemplate>
                            </asp:TemplateField>
                            <asp:BoundField DataField="PRID" HeaderText="PRID" InsertVisible="False" 
                                ReadOnly="True" SortExpression="PRID" />
                            <asp:BoundField DataField="Column1" HeaderText="Column1" 
                                SortExpression="Column1" />
                        </Columns>
                    </asp:GridView>
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:长铁物业公司资产数据库ConnectionString %>" 
                        DeleteCommand="DELETE FROM [ReceivableTable] WHERE [PRID] = @PRID" 
                        InsertCommand="INSERT INTO [ReceivableTable] ([ReceivableID], [PropertyIDR], [PropertyCRAR], [LeaseDateToR], [MonthRentR01]) VALUES (@ReceivableID, @PropertyIDR, @PropertyCRAR, @LeaseDateToR, @MonthRentR01)" SelectCommand="SELECT [ReceivableID], [PropertyIDR], [PropertyCRAR], [LeaseDateToR], [MonthRentR01], [PRID] ,
    ISNULL (MonthRentR01,'0')+  ISNULL (MonthRentR02,'0')+  ISNULL (MonthRentR03,'0')+  ISNULL (MonthRentR04,'0')+ 
    ISNULL (MonthRentR05,'0')+  ISNULL (MonthRentR06,'0')+  ISNULL (MonthRentR07,'0')+  ISNULL (MonthRentR08,'0')+  
    ISNULL (MonthRentR09,'0')+  ISNULL (MonthRentR10,'0')+  ISNULL (MonthRentR11,'0')+  ISNULL (MonthRentR12,'0') 
    
    FROM [ReceivableTable]" 
                        UpdateCommand="UPDATE [ReceivableTable] SET [ReceivableID] = @ReceivableID, [PropertyIDR] = @PropertyIDR, [PropertyCRAR] = @PropertyCRAR, [LeaseDateToR] = @LeaseDateToR, [MonthRentR01] = @MonthRentR01 WHERE [PRID] = @PRID">
                        <DeleteParameters>
                            <asp:Parameter Name="PRID" Type="Int32" />
                        </DeleteParameters>
                        <UpdateParameters>
                            <asp:Parameter Name="ReceivableID" Type="Int32" />
                            <asp:Parameter Name="PropertyIDR" Type="Int32" />
                            <asp:Parameter Name="PropertyCRAR" Type="String" />
                            <asp:Parameter DbType="Date" Name="LeaseDateToR" />
                            <asp:Parameter Name="MonthRentR01" Type="Decimal" />
                            <asp:Parameter Name="PRID" Type="Int32" />
                        </UpdateParameters>
                        <InsertParameters>
                            <asp:Parameter Name="ReceivableID" Type="Int32" />
                            <asp:Parameter Name="PropertyIDR" Type="Int32" />
                            <asp:Parameter Name="PropertyCRAR" Type="String" />
                            <asp:Parameter DbType="Date" Name="LeaseDateToR" />
                            <asp:Parameter Name="MonthRentR01" Type="Decimal" />
                        </InsertParameters>
                    </asp:SqlDataSource>
                </td>
                <td>
                    &nbsp;</td>
            </tr>
            <tr>
                <td>
                    &nbsp;</td>
                <td>
                    &nbsp;</td>
            </tr>
        </table>
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    </asp:Content>


    ==============后台========================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class Default13 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        private bool tableCopied = false;
        private System.Data.DataTable originalDataTable;
        protected void UpdateButton_Click(object sender, EventArgs e)
        {
            originalDataTable = (System.Data.DataTable)ViewState["originalValuesDataTable"];
    
            foreach (GridViewRow r in GridView1.Rows)
                if (IsRowModified(r)) { GridView1.UpdateRow(r.RowIndex, false); }
    
            // Rebind the Grid to repopulate the original values table.
            tableCopied = false;
            GridView1.DataBind();
        }
        protected void GirdView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
                if (!tableCopied)
                {
                    originalDataTable = ((System.Data.DataRowView)e.Row.DataItem).Row.Table.Copy();
                    ViewState["originalValuesDataTable"] = originalDataTable;
                    tableCopied = true;
                }
        }
    
        protected bool IsRowModified(GridViewRow r)
        {
            int currentID;
            DateTime currentLeaseDateToR;
            Decimal currentMonthRentR01;
            //string currentLastName;
            //string currentFirstName;
    
            currentID = Convert.ToInt32(GridView1.DataKeys[r.RowIndex].Value);
            //currentID = Convert.ToInt32(GridView1.DataKeys[0].Value);
    
            Response.Write(((TextBox)r.FindControl("TextBox_LeaseDateToR")).Text);
            if ((((TextBox)r.FindControl("TextBox_LeaseDateToR")).Text) != "")
                currentLeaseDateToR = Convert.ToDateTime(((TextBox)r.FindControl("TextBox_LeaseDateToR")).Text);
            else
                currentLeaseDateToR = Convert.ToDateTime("9999-01-01");
    
    
            //if ((((TextBox)r.FindControl("TextBox_LeaseDateToR")).Text) != "")
            //currentContractNumberR = ((Label)r.FindControl("Label_ContractNumberR")).Text;
            //else
            //    currentLeaseDateToR = Convert.ToDateTime("9999-01-01");
            
            
            if ((((TextBox)r.FindControl("TextBox_MonthRentR01")).Text) != "")
                currentMonthRentR01 = Convert.ToDecimal(((TextBox)r.FindControl("TextBox_MonthRentR01")).Text);
            else currentMonthRentR01 = 0;
            //currentMonthRentR01 = Convert.ToDecimal(((TextBox)r.FindControl("TextBox_MonthRentR01")).Text);
    
            System.Data.DataRow row =
                originalDataTable.Select(String.Format("PRID= {0}", currentID))[0];
    
            if (!currentLeaseDateToR.Equals(row["LeaseDateToR"].ToString())) { return true; }
            if (!currentMonthRentR01.Equals(row["MonthRentR01"].ToString())) { return true; }
    
            return false;
        }
    }


    =========前后截图对比====================

    前---------

    ----

    --后

     


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


    2012年3月30日 3:27
  • 尝试把:<asp:Parameter DbType="Date" Name="LeaseDateToR" />

    改成:<asp:Parameter  Name="LeaseDateToR" Type="DateTime" />

    如果还是不行,请删除所有的UpdateParameters中的参数(连同UpdateParameters自身)。


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

    2012年3月30日 3:58
  •     谢谢您的回复,我赶快上机试了试。首先,按照您第一个方法,把DbType="Date" 改成 Type="DateTime",点击更新,结果还是和以前一样:LeaseDateToR列被清空。然后我继续用第二步,“删除所有的UpdateParmeters中的参数”,出现了下图所示错误。我觉得这个问题要结合此例,http://msdn.microsoft.com/zh-cn/library/aa992036(v=VS.100).aspx?ppud=4  

    下面是截图

    ---- 


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

    2012年3月30日 8:51
  • 这个错误我无法解决……不过我提供一个替代方法……——

    请看我的批量提交示例代码:http://code.msdn.microsoft.com/CSASPNETExcelLikeGridView-a88756b3(英文的,你可以运行看看代码)


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

    2012年3月30日 8:56
  •     能否在

    protected void UpdateButton_Click(object sender, EventArgs e) { originalDataTable = (System.Data.DataTable)ViewState["originalValuesDataTable"]; foreach (GridViewRow r in GridView1.Rows) if (IsRowModified(r)) { GridView1.UpdateRow(r.RowIndex, false); } // Rebind the Grid to repopulate the original values table. tableCopied = false; GridView1.DataBind(); }

    中加入短日期模式呢? 粗体字部分的IF语句有可能加入吧?

    这一次的问题真的很纠结! Wei大 加油


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

    2012年3月30日 15:23
  • 短日期模式是显示模式,不应该在数据处理的代码段中加入,应该在aspx中ItemTemplate中格式化进行处理。

     <ItemTemplate>
                                    <asp:Label ID="Label_LeaseDateFromR" runat="server" 
                                        Text='<%#
    Eval("LeaseDateFromR","{0:d}") %>'></asp:Label>
                                </ItemTemplate>

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

    2012年3月31日 0:00
  • 短日期模式是显示模式,不应该在数据处理的代码段中加入,应该在aspx中ItemTemplate中格式化进行处理。

     <ItemTemplate>
                                    <asp:Label ID="Label_LeaseDateFromR" runat="server" 
                                        Text='<%#
    Eval("LeaseDateFromR","{0:d}") %>'></asp:Label>
                                </ItemTemplate>


    可是这样写又会把LeaseDateToR列的内容清空。我是不是钻进死胡同了?是不是最好彻底放弃《演练:GridView批量更新》这个“葫芦”啊?

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

    2012年3月31日 1:04
  •  应该不会清空的,除非你的LeaseDateFromR本身为空

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

    2012年3月31日 8:35
  •  应该不会清空的,除非你的LeaseDateFromR本身为空

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

    LeaseDateFromR 本身的确不为空,但只要在其他列输入了数据,不管是使用了您提供的 还是 shadow提供的 修改成短日期格式的方法。LeaseDateFormR列的数据统统被清空。我测试过多次了!

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

    2012年3月31日 13:38