c# - mvc - RadGrid se actualiza en la expansión de la tabla de detalles
telerik grid mvc (2)
Intenta usar el evento ItemCreated
.
Sospecho que está sucediendo lo siguiente:
Incendios de ItemDataBound, tus botones son creados
Hay una devolución de datos para vincular la tabla de detalles
Las filas primarias no se recuperan en este momento, por lo que ItemDataBound no se activa, por lo que los controles creados dinámicamente no se vuelven a crear, por lo que desaparecen.
Necesitaba crear una grilla con múltiples grupos en ciertas columnas, mi código es
<telerik:RadGrid Skin="MetroTouch" ID="grdQuestionnaire" RenderMode="Lightweight" runat="server"
AllowMultiRowSelection="True" AllowPaging="True" ShowGroupPanel="False"
AutoGenerateColumns="False" GridLines="none"
showchooser="true"
OnItemCommand="grdQuestionnaire_ItemCommand"
OnNeedDataSource="grdQuestionnaire_NeedDataSource"
OnItemDataBound="grdQuestionnaire_ItemDataBound"
OnDetailTableDataBind="grdQuestionnaire_DetailTableDataBind">
<GroupingSettings ShowUnGroupButton="false"></GroupingSettings>
<MasterTableView GroupLoadMode="Client" NoMasterRecordsText="No Question Added" TableLayout="Fixed" DataKeyNames="QuestionId,QuestionCode,LanguageQ">
<DetailTables >
<telerik:GridTableView NoDetailRecordsText="No Options Added" Name="Options" Width="100%">
<Columns>
<telerik:GridBoundColumn SortExpression="OptionDesc" HeaderText="Option" HeaderButtonType="TextButton"
DataField="OptionDesc">
</telerik:GridBoundColumn>
<telerik:GridBoundColumn SortExpression="OptionWeightage" HeaderText="Weightage" HeaderButtonType="TextButton"
DataField="OptionWeightage">
</telerik:GridBoundColumn>
</Columns>
</telerik:GridTableView>
</DetailTables>
<GroupByExpressions>
<telerik:GridGroupByExpression>
<SelectFields>
<telerik:GridGroupByField FieldAlias="WorkshopName" FieldName="WorkshopName" HeaderText="Workshop"></telerik:GridGroupByField>
</SelectFields>
<GroupByFields>
<telerik:GridGroupByField FieldName="WorkshopCode"></telerik:GridGroupByField>
</GroupByFields>
</telerik:GridGroupByExpression>
<telerik:GridGroupByExpression>
<SelectFields>
<telerik:GridGroupByField FieldAlias="" FieldName="AssessmentType" HeaderText="Type"></telerik:GridGroupByField>
<telerik:GridGroupByField FieldAlias="QuestionnaireDesc" FieldName="QuestionnaireDesc" HeaderText="Description" FormatString=""></telerik:GridGroupByField>
</SelectFields>
<GroupByFields>
<telerik:GridGroupByField FieldName="QuestionnaireCode"></telerik:GridGroupByField>
</GroupByFields>
</telerik:GridGroupByExpression>
<telerik:GridGroupByExpression>
<SelectFields>
<telerik:GridGroupByField FieldAlias="QuestionCode" FieldName="QuestionCode" HeaderText="Question">
</telerik:GridGroupByField>
</SelectFields>
<GroupByFields>
<telerik:GridGroupByField FieldName="QuestionCode"></telerik:GridGroupByField>
</GroupByFields>
</telerik:GridGroupByExpression>
</GroupByExpressions>
<Columns>
<telerik:GridBoundColumn DataField="QuestionDesc" HeaderText="Question"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="QuestionWeightage" HeaderText="Weightage"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="LanguageQ" HeaderText="Language"></telerik:GridBoundColumn>
<telerik:GridBoundColumn DataField="CreatedBy" HeaderText="Created By"></telerik:GridBoundColumn>
<telerik:GridTemplateColumn HeaderText="Action" UniqueName="colAction">
<HeaderStyle HorizontalAlign="Left" Font-Bold="false" VerticalAlign="NotSet" />
<ItemTemplate>
<asp:LinkButton ID="addOption" CommandName="addNewOption" runat="server" CssClass="btn btn-info">Add Options</asp:LinkButton>
<asp:LinkButton ID="deleteQuestion" CommandName="deletequestion" runat="server" CssClass="btn btn-danger">Delete</asp:LinkButton>
</ItemTemplate>
<HeaderStyle Font-Bold="True" />
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
1. Tengo un escenario en el que necesito mostrar botones con grupos : esta parte se realiza suscribiendo el evento OnItemDataBound
protected void grdQuestionnaire_ItemDataBound(object sender, GridItemEventArgs e)
{
if (e.Item is GridGroupHeaderItem)
{
GridGroupHeaderItem hi = (GridGroupHeaderItem)e.Item;
DataRowView groupDataRow = (DataRowView)e.Item.DataItem;
DataRowView drv = ((DataRowView)e.Item.DataItem);
string collumname = drv.DataView.Table.Columns[0].ColumnName;
switch (collumname)
{
case "WorkshopName":
{
LinkButton btn = new LinkButton();
btn.Text = "Add workshop";
// btn.OnClientClick = "if (!confirm(''Are you sure you all information is correct for this employee?'')) return false;";
btn.CssClass = "btn btn-sm btn-info";
btn.Style.Add(HtmlTextWriterStyle.MarginRight, "0px");
btn.CommandName = "AddWorkshop";
TableCell customcell = new TableCell();
customcell.Controls.Add(btn);
hi.Cells.Add(customcell);
hi.Cells[hi.Cells.Count - 2].ColumnSpan = hi.Cells[hi.Cells.Count - 2].ColumnSpan - 1;
break;
}
case "QuestionCode":
{
LinkButton btn = new LinkButton();
btn.Text = "Add question";
btn.CssClass = "btn btn-sm btn-success";
btn.Style.Add(HtmlTextWriterStyle.MarginRight, "0px");
btn.CommandName = "AddQuestion";
TableCell customcell = new TableCell();
customcell.Controls.Add(btn);
hi.Cells.Add(customcell);
hi.Cells[hi.Cells.Count - 2].ColumnSpan = hi.Cells[hi.Cells.Count - 2].ColumnSpan - 1;
break;
}
}
}
}
La salida para este código es la siguiente
En la expansión, la tabla proviene de otra tabla de datos que agrego del siguiente evento OnDetailTableDataBind
protected void grdQuestionnaire_DetailTableDataBind(object sender, Telerik.Web.UI.GridDetailTableDataBindEventArgs e) { GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem; string n = e.DetailTableView.Name; string QuestionCode = dataItem.GetDataKeyValue("QuestionCode").ToString(); string Language = dataItem.GetDataKeyValue("LanguageQ").ToString(); DataSet ds = clsQuestionnaireDAC.GetOptions(QuestionCode, Language); e.DetailTableView.DataSource = ds.Tables[0]; }
No sé por qué ocurre el problema cuando la tabla se expande. Mis botones personalizados desaparecen misteriosamente y descansa en la cuadrícula. aquí está el resultado después de expandir la tabla de detalles Cualquiera puede guiarme a través de esta situación para evitar mi MasterTableView como está antes de la expansión.
En general, es una mejor idea usar plantillas en escenarios similares: http://docs.telerik.com/devtools/aspnet-ajax/controls/grid/functionality/grouping/group-header-and-footer-templates
Por ejemplo, si tiene la siguiente definición:
<GroupByExpressions>
<telerik:GridGroupByExpression>
<GroupByFields>
<telerik:GridGroupByField FieldName="ShipCountry" />
</GroupByFields>
<SelectFields>
<telerik:GridGroupByField FieldName="ShipCountry" />
</SelectFields>
</telerik:GridGroupByExpression>
<telerik:GridGroupByExpression>
<GroupByFields>
<telerik:GridGroupByField FieldName="ShipName" />
</GroupByFields>
<SelectFields>
<telerik:GridGroupByField FieldName="ShipName" />
</SelectFields>
</telerik:GridGroupByExpression>
</GroupByExpressions>
Puedes usar algo similar a esto:
<GroupHeaderTemplate>
<asp:Label runat="server" ID="ShipCountryLabel" Text=''<%# "ShipCountry: "+
(((GridGroupHeaderItem)Container).AggregatesValues["ShipCountry"]) %>''
Visible=''<%# ((((GridGroupHeaderItem)Container).AggregatesValues["ShipCountry"]) != null) %>''>
</asp:Label>
<asp:Label runat="server" ID="ShipNameLabel" Text=''<%# "ShipName: "+
(((GridGroupHeaderItem)Container).AggregatesValues["ShipName"]) %>''
Visible=''<%# ((((GridGroupHeaderItem)Container).AggregatesValues["ShipName"]) != null) %>''>
</asp:Label>
<br />
<asp:Button ID="Button2" runat="server" Text="MyButton"
Visible=''<%# ((((GridGroupHeaderItem)Container).AggregatesValues["ShipName"]) != null) %>'' />
</GroupHeaderTemplate>
Esto mostrará el botón solo para el nivel interno del grupo.
Si insistes en usar un enfoque de código subyacente, deberás usar ItemCreated. Puede usar el enfoque que se muestra a continuación para extraer el nombre del campo y agregar el control en una etapa posterior del ciclo de vida de la página:
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
if (e.Item is GridGroupHeaderItem)
{
GridGroupHeaderItem headerItem = e.Item as GridGroupHeaderItem;
int index = headerItem.GroupIndex.Split(''_'').Length - 1;
GridGroupByExpression exp = headerItem.OwnerTableView.GroupByExpressions[index] as GridGroupByExpression;
string fieldName = exp.GroupByFields[0].FieldName;
if (fieldName == "ShipName")
{
Button button = new Button()
{
ID = "GroupButton1",
Text = "MyButton"
};
headerItem.Load += (s, a) =>
{
headerItem.DataCell.Controls.Add(new Literal() { Text = headerItem.DataCell.Text });
headerItem.DataCell.Controls.Add(button);
};
}
}
}
Espero que esto sea útil.