2010-08-16 4 views
4

Je dois afficher une liste de champs. Certains sont modifiables et d'autres non. Ceux qui sont peuvent être de différents types, tels que les champs de texte, les dates, les heures ou les booléens. J'utilise RadGrid de Telerik. Voir la capture d'écran pour un projet de test que j'ai fait.Telerik RadGrid avec différents types de contrôles d'édition

Questions: Dans le gestionnaire d'élément créé, pourquoi y a-t-il 4 cellules? J'ai dû remplir les cellules [2] et les cellules [3] pour les valeurs à afficher. J'ai mis AutoGenerateColumns à false, et j'ai seulement deux définitions GridTemplateColumn.

Pourquoi item.RowIndex est-il incrémenté de deux et va jusqu'à vingt? Quand j'ai 10 lignes.

Y a-t-il une meilleure façon de procéder?

Voilà comment je déclarai la grille:

 <telerik:RadGrid runat="server" ID="Grid1" Width="100%" Height="500px" GridLines="None" AutoGenerateColumns="false" 
     OnItemCreated="OnGridItemCreated" 
     OnNeedDataSource="OnGridNeedDataSource"> 
     <ItemStyle Wrap="true" /> 
     <AlternatingItemStyle Wrap="true" /> 
     <ClientSettings>      
      <Selecting AllowRowSelect="false" /> 
      <Scrolling AllowScroll="true" UseStaticHeaders="true" /> 
      <Resizing AllowColumnResize="true" ClipCellContentOnResize="true" ResizeGridOnColumnResize="true" EnableRealTimeResize="true" /> 
     </ClientSettings> 
     <MasterTableView> 
      <NoRecordsTemplate> 
       <asp:Label ID="lblNorec1" runat="server" Text="No records"></asp:Label> 
      </NoRecordsTemplate> 
      <Columns> 
       <telerik:GridTemplateColumn UniqueName="FieldDisplayName" HeaderText="Field Name"> 
        <ItemTemplate> 
        </ItemTemplate> 
       </telerik:GridTemplateColumn> 
       <telerik:GridTemplateColumn UniqueName="FieldValue" HeaderText="Value"> 
        <ItemTemplate> 
        </ItemTemplate> 
       </telerik:GridTemplateColumn> 
      </Columns> 
     </MasterTableView> 
    </telerik:RadGrid> 

/

/ grid needs datasource 
    protected void OnGridNeedDataSource(object source, GridNeedDataSourceEventArgs e) 
    { 
     // create a DataSource 
     DataSet ds = new DataSet(); 
     DataTable dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Field_Display_Name")); 
     dt.Columns.Add(new DataColumn("Field_Value")); 

    for (int i = 0; i < 10; ++i) 
    { 
     DataRow dr = dt.NewRow(); 
     dr["Field_Display_Name"] = "Item Id" + i.ToString(); 
     dr["Field_Value"] = "Value" + i.ToString(); 
     dt.Rows.Add(dr); 
    } 

    ds.Tables.Add(dt); 
    Grid1.DataSource = ds; 
} 

// grid item is created 
protected void OnGridItemCreated(object sender, GridItemEventArgs e) 
{ 
    if (e.Item is GridDataItem) 
    { 
     GridDataItem item = (GridDataItem)e.Item; 

     // fill in cells 2 and 3. Why are there 4? 

     Label lbl = new Label(); 
     lbl.Text = "Field " + item.RowIndex; 
     item.Cells[2].Controls.Add(lbl); 

     switch (item.RowIndex) 
     { 
      case 2: 
      case 8: 
       RadTextBox txt = new RadTextBox(); 
       txt.ID = "RadTextBox1"; 
       txt.Text = "hello " + item.RowIndex; 
       item.Cells[3].Controls.Add(txt); 
       break; 
      case 4: 
      case 10: 
       RadDatePicker dp = new RadDatePicker(); 
       dp.ID = "RadDatePicker1"; 
       dp.SelectedDate = DateTime.Now; 
       item.Cells[3].Controls.Add(dp); 
       break; 
      case 6: 
      case 12: 
       CheckBox cb = new CheckBox(); 
       item.Cells[3].Controls.Add(cb); 
       break; 
      default: 
       Label lbl2 = new Label(); 
       lbl2.Text = "Value " + item.RowIndex; 
       item.Cells[3].Controls.Add(lbl2); 
       break; 
     } 
    } 
} 

alt text http://img193.imageshack.us/img193/1254/customgrid.png

+0

Je suis passé à l'événement OnItemDataBound et j'ai utilisé ItemIndex au lieu de RowIndex. Cela me donne une valeur d'index de 0-9 Évidemment, les colonnes 0 et 1 sont toujours créées pour les éléments de commande. Au lieu de référencer par index, j'ai changé pour un nom de colonne unique. // définir le texte dans la première colonne item ["FieldDisplayName"]. Text = "Field" + index; // ajouter un contrôle dans la colonne secon RadTextBox txt = new RadTextBox(); txt.ID = "RadTextBox1"; txt.Text = "bonjour" + index; item ["FieldValue"]. Controls.Add (txt); – BrianK

Répondre

1

Si la grille reflète vos besoins réels, je vous suggère d'aller avec une table HTML à l'intérieur d'un ASP FormView. Vous pouvez tracer la plupart des choses que vous avez montrées ici directement dans le HTML. Il existe de nombreux tutoriels FormView, il semble que ce soit plus une solution pour ce que vous recherchez. Ne laissez pas la complexité d'essayer de presser ce genre de choses dans un radgrid vous faire aller dans la mauvaise direction.

Si vous voulez afficher 10 enregistrements à la fois, c'est là que le gridview/radgrid est utile, si ce n'est qu'un enregistrement à la fois, regardez dans formview.

EDIT: Je viens de remarquer que c'était demandé comme il y a un an. J'espère que vous n'attendez pas encore une réponse pour celui-ci!

Questions connexes