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