2010-08-06 106 views
1

我看到另一個線程有點像我的問題在:格式電話號碼的GridView

ASP.NET GridView Column - formatting telephone number

,但我不知道這是否是因爲他是使用代碼隱藏,使科拉姆回答我的問題。我所做的只是在Visual Studio中插入GridView控件。順便說一句,數據正在填充在網格中,我只是試圖獲取格式設置。

我使用Microsoft Visual Studio 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完成......一些看起來這樣


更新:我貼錯碼本來,無論哪種方式,根據關我說凱爾西是能夠提出我的答案是工作。

下面是我的新代碼與凱利給出的更正。

<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> 
+0

@ patco258您的'GridView'代碼在這裏最有幫助。 – Kelsey 2010-08-06 22:47:55

+0

我用GridView代碼更新了這篇文章,並給出了更正。有用。 此外,在改變之前,而不是模板字段,它是那裏的界限,就像Kelsey在她的回答中一樣。 – Patrick 2010-08-10 16:57:08

回答

7

既然你沒有張貼您的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,而不是隻有int,它是32位,因爲10位數字不適合。

我已經測試它和它的作品:)

+0

太棒了。我上班時會檢查一下。非常感謝。我實際上認爲我發佈了我需要的所有GridView代碼。我想我沒有。有一部分代碼明顯地格式化了顏色..網格大小等..我不知道它也是字段格式化的關鍵部分..我想這是我發佈的代碼,它調用信息,猜猜我錯了。 我是非常新的asp.net和vb.net ..大約1個月前。我喜歡它。這就像一個謎題。 當我得到它的工作,我會做一個職位,我採取的步驟。非常感謝您的幫助。 – Patrick 2010-08-08 04:35:11

+0

在我第一次發佈之前,我刪除了我的表並使用SQL Management Studio中的一個int來重新創建它。我是否應該將它更改回varchar(50)或者它甚至是重要的,因爲我將用您所陳述的內容替換我的代碼? 據我所知,「模板」會將數據轉換爲Int64,並且將字段中的數據作爲字符串或整型數據並不重要,但我可能是錯的。 – Patrick 2010-08-08 04:45:48

+1

@ patco258我的答案假設您的電話號碼字段是一個字符串,如上所述。如果它是一個整數,你不需要做所有這些額外的工作,但由於它是一個字符串,你將需要一個模板字段,就像我發佈的做一些額外的工作是發生在' Literal'。 – Kelsey 2010-08-08 06:07:14

0

動態列 - 不容易...... 我的數據源(MS SQL)與UDF後的去向。

/* 
    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」

Correctly formatted

0

另一種選擇的結果是修改SELECT語句轉換爲數值(即可以保持足夠的位數),只要你相信它不包含任何不是數字的字符。在SQL Server中,這是通過內置的CAST或CONVERT函數來完成:

SELECT CAST(Phone as BIGINT) as Phone 

然後用DataFormatString一個BoundField將如預期:

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

我一般避免模板字段,因爲那時我無法設置

EnableSortingAndPagingCallbacks="True" 

在gridview上。我也喜歡邊界領域的精簡代碼。