【问题标题】:Format Telephone Number in GridView在 GridView 中格式化电话号码
【发布时间】:2010-08-06 20:53:17
【问题描述】:

我看到另一个线程有点像我的问题:

ASP.NET GridView Column - formatting telephone number

但我不知道它是否回答了我的问题,因为他正在使用代码隐藏来制作列。我所做的只是在 Visual Studio 中插入 GridView 控件。顺便说一句,数据正在填充到网格中,我现在只是想获取格式设置。

我正在使用 Microsoft Visual Studio Professional 2010。(我的数据库也使用 SQL Management Studio,但可能不需要此信息,只是尝试提供足够的信息以确保我正在做的事情被理解)

我正在用 ASP.NET 制作一个网站,后面有 Visual Basic.net 代码。

该网站基本上是一个联系人列表网站。

3 个文本框字段。名字、姓氏、主要电话号码。

添加记录按钮(从文本框中获取信息并插入数据库)

显示正在填充信息的数据库的 GridView

我有一个“主要电话号码”列,这会拉出一个电话号码以显示在 GridView 中。号码只有10位数字,没有格式……(即999-999-9999)

我正在尝试让 GridView 获取 9999999999 并使其 (999) 999-9999

如果我查看 DataFormatString,我尝试了许多“{0:(###) ###-####}”的组合,带和不带引号以及全零而不是井号。

通过我的研究,如果我想使用 DataFormatString,我需要将我的电话号码在我的数据库中设置为 int。所以我删除了我的表并将其从 varchar 重新创建为 int。我通过单击 Gridview 任务(GridView 右上角的箭头)...然后“编辑列”...然后在“选定字段”下单击列的名称...“主要电话号码”来访问 DataFormatString然后在“CommandField 属性”下向下滚动到“DataFormatString”。

我希望我没有说得太详细。我非常感谢所有的帮助。

我发现了这个:

http://www.tek-tips.com/viewthread.cfm?qid=328173

但我不知道我将如何使用它.. 看看如何,因为我的代码是由 Visual Studio 完成的......其中一些看起来像这样


更新:我最初发布了错误的代码,无论哪种方式,基于我所说的 Kelsey 能够为我提出一个可行的答案。

以下是我的新代码,其中包含凯利给出的更正。

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="EmpId" DataSourceID="SqlDataSource1" 
            EmptyDataText="There are no data records to display." CellPadding="4" 
        ForeColor="#333333" GridLines="None" Height="136px" Width="299px" 
              AllowSorting="True">
            <AlternatingRowStyle BackColor="White" />
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
                <asp:BoundField DataField="EmpId" HeaderText="EmpId" ReadOnly="True" 
                    SortExpression="EmpId" Visible="False" />
                <asp:BoundField DataField="FirstName" HeaderText="First Name" 
                    SortExpression="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="Last Name" 
                    SortExpression="LastName" />
<%--                <asp:BoundField DataField="MainPhoneNumber" HeaderText="Main Phone Number" 
                    SortExpression="MainPhoneNumber" />--%>
                    <asp:TemplateField HeaderText="Main Phone Number"> 
                <ItemTemplate> 
                 <asp:Literal ID="litPhone"  runat="server" Text='<%# string.Format("{0:(###) ###-####}", Int64.Parse(Eval("MainPhoneNumber").ToString())) %>' /> 
                </ItemTemplate> 
                </asp:TemplateField> 

            </Columns>
            <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
            <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
            <SortedAscendingCellStyle BackColor="#FDF5AC" />
            <SortedAscendingHeaderStyle BackColor="#4D0000" />
            <SortedDescendingCellStyle BackColor="#FCF6C0" />
            <SortedDescendingHeaderStyle BackColor="#820000" />
        </asp:GridView>

【问题讨论】:

  • @patco258 你的GridView 代码在这里会很有帮助。
  • 我用 GridView 代码更新了这篇文章,并提供了您提供的更正。有用。此外,在更改之前,不是模板字段而是边界字段,就像 Kelsey 在她的回答中所说的那样。

标签: asp.net data-binding gridview formatting string-formatting


【解决方案1】:

由于您没有发布您的 GridView 代码,我不得不假设您的列使用的是 BoundField 像这样或类似的东西:

<Columns>
    <asp:BoundField DataField="MainPhoneNumber" DataFormatString="{0:(###) ###-####}" />

由于它是一个字符串,因此您不能使用 DataFormatString 属性,因此您需要将您的 BoundField 更改为 TemplateField。只需将您的 BoundField 替换为以下 TemplateField 即可:

<asp:TemplateField>
    <ItemTemplate>
        <asp:Literal ID="litPhone" runat="server" Text='<%# string.Format("{0:(###) ###-####}", Int64.Parse(Eval("MainPhoneNumber").ToString())) %>' />
    </ItemTemplate>
</asp:TemplateField>

这里的关键是评估数据绑定字段并将其转换为Int64 以便字符串格式化程序能够工作的代码。请注意,我使用的是 Int64 而不仅仅是 32 位的 int,因为不适合 10 位数字。

我已经测试过了,它可以工作:)

【讨论】:

  • 太棒了。我上班时会检查一下。非常感谢。我实际上以为我发布了我需要的所有 GridView 代码。我想我没有。有一部分代码显然格式化了颜色..网格大小..等等..我不知道它也是字段格式化的关键部分..我认为这是我发布的代码调用信息,猜我错了。大约 1 个月前,我对 asp.net 和 vb.net 还是很陌生。我喜欢它。这就像一个谜题。当我得到它的工作时,我会用我采取的步骤发布一个帖子。非常感谢您的帮助。
  • 在我第一次发布之前,我删除了我的表并重新创建了它,其中 EmpID 是 SQL Management Studio 中的一个 int。我应该把它改回 varchar(50) 还是因为我将用你所说的替换我的代码,所以这是否重要?据我了解,“模板”会将数据转换为 Int64,我将字段中的数据作为字符串还是 int 都没有关系。但我可能是错的。
  • @patco258 我的回答假设您的电话号码字段是如上所述的字符串。如果它是一个整数,你就不需要做所有这些额外的工作,但是因为它是一个字符串,你需要一个像我发布的模板字段来做一些额外的工作,这是在 @ 的 Text 属性中内联发生的987654334@.
  • 我不是有意混淆。我确实在我的原始帖子中写了这个......“所以我删除了我的表并将它从 varchar 重新创建为 int。”简而言之。我删除了我的表,因为它是一个 varcar 数据类型。并从 SQL Management Studio 将数据类型设为 int。我希望这能解决问题。我很感激帮助。老实说,我对此完全陌生,所以即使它是我的 SQL Management Studio 表中的一个 int ......我不知道我是否会不小心把它变成一个字符串。我有文本框字段,该值进入 SQL 数据库,该值返回到 Gridview。
  • 这行得通。我唯一添加的是 示例中的标题:> 非常感谢您的帮助!
【解决方案2】:

在动态列上 - 不那么容易... 我用 udf 追踪了数据源 (MS SQL)。

/*
    print dbo.formatPhone('1234567');
    print dbo.formatPhone('1234567890');
    print dbo.formatphone('(314)522-4949');
    print dbo.formatPhone('(314) 522-4949 x 104');
*/

create Function [udf_FormatPhone]
(
    @rawPhone as varChar(50) = null
) Returns VarChar(50) 
As
begin 
Declare @formatPhone varChar(50);
Declare @len int;

set @rawPhone = replace(@rawPhone,'(','');
set @rawPhone = replace(@rawPhone,')','');
set @rawPhone = replace(@rawPhone,'-','');
set @rawPhone = replace(@rawPhone,' ','');
set @len=len(@rawPhone)

set @formatPhone =Case
when @len < 7   then @rawPhone
when @len =7    then Substring(@RawPhone,1,3) + '-' + substring(@RawPhone,4,4)
when @len =10   then substring(@RawPhone,1,3) + '-' + substring(@RawPhone,4,3) + '-' + substring(@RawPhone,7,4)
when @len > 10  then substring(@rawPhone,1,3) + '-' + substring(@rawPhone,4,3) + '-' + substring(@RawPhone,7,4) + ' ' + substring(@rawPhone,11,50)
else    @RawPhone
end

return(@formatPhone);
end

和“3015551212x234”的结果

【讨论】:

    【解决方案3】:

    另一种选择是修改 SELECT 语句以强制转换为一个数字(可以容纳足够多的数字),只要您确定它不包含任何不是数字的字符。在 SQL Server 中,这是通过内置的 CAST 或 CONVERT 函数完成的:

    SELECT CAST(Phone as BIGINT) as Phone
    

    然后带有 DataFormatString 的绑定字段将按预期工作:

    DataFormatString="{0:(###) ###-####}"
    

    我通常会避免使用模板字段,因为那样我就无法设置

    EnableSortingAndPagingCallbacks="True"
    

    在网格视图上。我也喜欢 boundfield 中的精简代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多