Hej Gör det inte från kod. Det är mycket lättare att göra den delen i markup. Då kan du skapa en templatecolumn tag och inne i den bara skapa visningen... Typ: Alternativt kan du skapa en ny klass som implementerar ITemplate. Dvs i princip en klass som implementerar InstantiateIn i vilken den skapa sitt kontent och lägger till det i kontrollen som skickas in i metoden... Men då har du låst upp layouten i kode, vilket inte är speciellt bra om man vill ändra i framtiden. Min tidigare post är nog lämpligare.... Nu börjar jag fatta. En sak som jag dock inte förstår är hur det skall se ut i codebehind. jag får det inte att fungera.datagrid och textbox
Jag har en websida med massa olika fält bla datagrid där jag presenterar data från en DB. Om man väljer edit så vill jag att användaren skall kunna ändra innehållet. Dvs datagrid columnen behöver vara ett textfält som man kan ändra innehållet i.
Jag använder BoundColumn för att presentera data och bör väl använda templatecolumn för textboxen, men jag får inte till det.
Vid frågetecknen vet jag inte vad jag skall skriva.
<code>
BoundColumn LblCol = new BoundColumn();
LblCol.DataField = ("content");
LblCol.HeaderText = GridLabels[1];
LblCol.ItemStyle.Width = new Unit(GridColWidths[1]);
LblCol.ItemStyle.VerticalAlign = VerticalAlign.Top;
TemplateColumn MemoCol = new TemplateColumn();
MemoCol.ItemTemplate = ????????????????
MemoCol.HeaderText = GridLabels[1];
MemoCol.ItemStyle.Width = new Unit(GridColWidths[1]);
MemoCol.ItemStyle.VerticalAlign = VerticalAlign.Top;
if (Editing)
{
DG_Units.Columns.add(MemoCol);
}
else
{
DG_Units.Columns.Add(LblCol);
}
DG_Units.DataBind();
</code>
Någon med tips? Tacksam för all hjälp.Sv: datagrid och textbox
<asp:DataGrid runat=server ID="DG_Units">
<Columns>
<asp:BoundColumn DataField="Content"></asp:BoundColumn>
<asp:TemplateColumn>
<EditItemTemplate>
<asp:TextBox runat=server ID="tb" Text='<%# Eval(Container.DataItem,"Content") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Literal runat=server ID"lit" Text='<%# Eval(Container.DataItem,"Content") %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
Kanske inte helt perfekt kod, men du förstår nog principen...
Sen är det bara i codebehind att databinda och bestämma om den ska vara i EditMode eller inte
<code>
DG_Units.EditItemIndex = 0;
DG_Units.DataBind();
</code>
Denna lösning ger iofs bara edit till en rad i taget... Alternativet är att bara ha en ItemTemplate och sedan i ItemDataBound eventet visa eller dölja texbox respektive literal. Hänger du med? Typ:
<asp:DataGrid runat=server ID="DG_Units"OnItemDataBound="DG_Units_ItemDataBound"></>
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:TextBox runat=server ID="tb" Text='<%# Eval(Container.DataItem,"Content") %>'></asp:TextBox>
<asp:Literal runat=server ID"lit" Text='<%# Eval(Container.DataItem,"Content") %>'></asp:Literal>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
och codebehind
<code>
protected void DG_Units_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.FindControl("tb").Visible = Edit;
e.Item.FindControl("lit").Visible = !Edit;
}
}
</code>
Går säkert att göra snyggare, men det bör fungera...
Sv: datagrid och textbox
Sv:datagrid och textbox
Skall jag anropa den funktionen som du skrivit, och hur skall det anropet se ut?
Hur skall argumenten se ut som jag skickar in i funktionen?
<code>
DG_Units_ItemDataBound(?????);
</code>Sv: datagrid och textbox
Jag kan ta bort det som du givit som exempel i codebehind utan att det gör någon skillnad. Enda gången ha nvisar textbox är om man inte fyller datagriden med info i kolumnerna mhja boundcolumn. Vad missar jag ?
Mycket tacksam för hjälp.