1

Je vois un autre fil un peu comme ma question:Format Numéro de téléphone à GridView

ASP.NET GridView Column - formatting telephone number

mais je ne sais pas si cela répond à ma question comme il utilise le code-behind pour faire le Colum. Tout ce que j'ai fait était d'insérer le contrôle GridView dans Visual Studio. BTW, les données sont peuplées dans la grille, j'essaie juste d'obtenir le jeu de mise en forme maintenant.

J'utilise Microsoft Visual Studio Professional 2010. (également SQL Management Studio pour ma base de données, mais cette information ne peut pas être nécessaire, juste essayer de donner assez pour vous assurer que ce que je fais est compris)

Je suis faire un site Web dans ASP.NET avec le code Visual Basic.net derrière.

Le site est essentiellement un site de liste de contacts.

3 Zones de zone de texte. Prénom, nom, numéro de téléphone principal.

Ajouter un bouton d'enregistrement (Prend les informations des zones de texte et des insertions dans une base de données)

GridView qui montre la base de données qui est en cours avec les informations

J'ai une colonne « Main numéro de téléphone » et cela tire un numéro de téléphone à afficher dans GridView. Le nombre est à seulement 10 chiffres, pas de mise en forme ... (c.-à-999-999-9999)

Je suis en train de faire GridView prendre le 9999999999 et le faire (999) 999-9999

Si je regarde DataFormatString J'ai essayé de nombreuses combinaisons de "{0: (###) ### - ####}" avec et sans les guillemets et aussi avec tous les zéros à la place des signes dièse.

Grâce à mes recherches, il m'a semblé que si je voulais utiliser DataFormatString, je devais créer un numéro de téléphone dans ma base de données. J'ai donc supprimé ma table et l'ai recréée à partir d'un varchar vers un int. J'arrive à la DataFormatString en cliquant sur Gridview Tasks (flèche en haut à droite de GridView) ... puis "Edit columns" ... puis sous "Selected Fields" je clique sur le nom de la colonne ... "Main Phone Number" puis, dans la section "Propriétés de CommandField", je défile vers "DataFormatString".

J'espère ne pas être trop détaillé. J'ai vraiment apprécié toute l'aide.

Je trouve ceci:

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

mais je ne sais pas comment je voudrais aller à l'utiliser .. car comment parce que mon code a été fait par Visual Studio ... certaines d'entre elles semble comme celui-ci


MISE à JOUR: J'ai posté le mauvais code à l'origine, de toute façon, d'après ce que je l'ai dit de Kelsey était en mesure de proposer une réponse pour moi qui a travaillé.

Ci-dessous est mon nouveau code avec les corrections que Kelly a donné.

<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 Votre code 'GridView' serait le plus utile ici. – Kelsey

+0

J'ai mis à jour ce post avec le code GridView avec la correction que vous avez donnée. Ça marche. En outre, avant le changement au lieu du champ modèle, c'était le champ lié qui était là, tout comme Kelsey a dans sa réponse. – Patrick

Répondre

7

Puisque vous ne publiez pas votre code GridView je dois supposer que vos colonnes utilisent un BoundField comme celui-ci ou quelque chose de similaire:

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

Puisqu'il est une chaîne, vous ne pouvez pas utilisez la propriété DataFormatString de sorte que vous devrez remplacer votre BoundField par un TemplateField. Il suffit de remplacer votre BoundField avec le TemplateField suivant et il devrait fonctionner:

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

La clé est le code ici qui permet d'évaluer le champ databound et la convertit en un Int64 afin que la chaîne de formatter fonctionnera. Notez que j'utilise un Int64 et pas seulement un int qui est en 32 bits car un nombre à 10 chiffres ne convient pas.

Je l'ai testé et il fonctionne :)

+0

Génial. Je vais vérifier cela quand je vais travailler. Merci beaucoup. En fait, je pensais que j'avais posté tout le code GridView dont j'avais besoin. Je suppose que je ne l'ai pas fait. Il y avait une partie du code qui formate apparemment les couleurs .. taille de la grille .. etc .. Je ne savais pas que ce serait aussi la partie clé de la mise en forme du champ .. Je pensais que c'était le code que j'ai posté qui appelle le informations, suppose que j'avais tort. Je suis très nouveau sur asp.net et vb.net .. il y a environ 1 mois. J'aime ça. C'est comme un puzzle. Quand je l'aurai fonctionné, je ferai un post avec les étapes que j'ai prises. Merci beaucoup pour ton aide. – Patrick

+0

Avant la première publication, j'ai supprimé ma table et l'ai recréée avec l'EmpID étant un int dans SQL Management Studio. Devrais-je changer cela en un varchar (50) ou est-ce important puisque je remplacerai mon code par ce que vous avez déclaré?Si je comprends bien, le "template" va convertir les données en un Int64 et peu importe si j'ai mes données dans un champ comme une chaîne ou un int .. mais je peux me tromper. – Patrick

+1

@ patco258 Ma réponse supposait que le champ de votre numéro de téléphone était une chaîne comme indiqué ci-dessus. Si c'est un entier, vous n'aurez pas besoin de faire tout ce travail supplémentaire, mais puisqu'il s'agit d'une chaîne, vous aurez besoin d'un champ modèle comme je l'ai posté pour faire un peu plus de travail en ligne dans la propriété 'Text' du' Literal'. – Kelsey

0

sur des colonnes dynamiques - pas aussi facile ... Je suis allé après la source de données (MS SQL) avec un 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 

et le résultat de « 3015551212x234 »

Correctly formatted

0

Une autre alternative est de modifier l'instruction SELECT pour lancer un certain nombre (qui peut contenir suffisamment de chiffres) tant que vous êtes sûr qu'il ne contient aucun caractère qui ne soit un nombre. Dans SQL Server cela se fait via la construction dans CAST ou CONVERT fonctions:

SELECT CAST(Phone as BIGINT) as Phone 

Puis un BoundField avec DataFormatString fonctionnera comme prévu:

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

J'évite généralement des champs de modèle parce que je ne peux pas mettre

EnableSortingAndPagingCallbacks="True" 

sur une grille. J'aime aussi le code plus léger du boundfield.

Questions connexes