Hello! I have a model whose foreign key references itself. To provide some more context, I have a table in my database called "Categories", and this table may contain categories or sub-categories, depending on whether they have a reference to a "Non-sub-category" or not.
Having this into account, I am using a grid that contains a foreign key, as the following:
@(Html.Kendo().Grid<CategoriesViewModel>()
.Name(
"CategoriesGrid"
)
.Columns(columns =>
{
columns.Bound(c => c.Name).Width(50);
columns.ForeignKey(c => c.ParentCategoryId,
(System.Collections.IEnumerable)ViewData[
"Categories"
],
"CategoryId"
,
"Name"
)
.Filterable(filterable => filterable
.Extra(
false
)
)
.Width(50);
columns.Command(command => command.Edit()).Width(50);
})
.ToolBar(toolbar => toolbar.Create())
.Editable(e => e.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(5)
.ServerOperation(
false
)
.Model(model =>
{
model.Id(a => a.CategoryId);
model.Field(a => a.ParentCategoryId).DefaultValue(
null
);
})
.Create(update => update.Action(
"CreateCategory"
,
"Categories"
))
.Read(read => read.Action(
"GetCategories"
,
"Categories"
))
.Update(update => update.Action(
"EditCategory"
,
"Categories"
))
)
The behaviour I desire is to add lines to this table and have the "ForeignKey" dropdown automatically updated. So for instance, if I add a category "Animal", when I am creating a new sub-category (e.g. a "Cat") I want to see already displayed "Animal" in my dropdown. I also want to be able to have an "Empty value" on the dropdown (like a placeholder), so I can indicate that the new category is a "Primary category" (i.e. a non-sub-category). I understand that the "ForeignKey" data is statically bound, and the only way I have right now to display the newly inserted data is to force a reload on the page.
Is not there any workarounds to update my "ForeignKey" dropdown on a grid change (Create or Edit)?
Regards,
Manuel
Hi. I'm trying to run very simple validation for the grid inline edit function.
- GridEditMode.InLine
- Server binding
- Trying to add "onsubmit" attribute to the "GridForm" form element (it does not work)
Or does DataAnnotation based validation works for this case? If so, please let me know any sample code for that. I could only see AJAX version or non-grid version.
Below is my cshtml file:
@using Kendo.Mvc.UI;
@using Kendo.Mvc.Extensions;
@model WebApp.Features.Vendor.Index.Result
@{
ViewBag.Title = "Vendor Management";
}
<div class="jumbotron">
<div id="clientsDb">
@Html.ValidationDiv()
@(Html.Kendo().Grid((IEnumerable<PayBy.WebApp.Features.Vendor.UiController.Vendor>)Model.Vendors)
.Name("Grid")
.Columns(columns =>
{
columns.Bound(c => c.VendorName).Title("Name").Width(30);
columns.Bound(c => c.IsInternal).Title("Internal").Width(30);
columns.Bound(c => c.AccountName).Title("Account").Width(50);
columns.Command(commands => commands.Edit()).Width(30);
})
.ToolBar(toolbar => toolbar.Create().Text("Add"))
.Sortable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.HtmlAttributes(new { style = "height: 480px;" })
.Scrollable()
.DataSource(dataSource => dataSource
.Server()
.Model(model =>
{
model.Id(p => p.Id);
model.Field(f => f.AccountName).Editable(false);
})
.Create("Update", "Vendor")
.Update("Update", "Vendor")
.Sort(sort => sort.Add("VendorShortName").Ascending())
)
)
</div>
</div>
<div class="row">
</div>
<script>
var form = $('#GridForm');
if (form != null) {
form.attr('onsubmit', 'return ValidateForm();');
}
function ValidateForm()
{
alert('validate');
if ($('#VendorName').val().length == 0) {
alert('[Name] Required field.');
return false;
}
if ($('#VendorName').val().length > 256) {
alert('[Name] Maximum 256 letters.');
return false;
}
return true;
}
</script>
Is there a demo of how to connect a chart to the selected row(s) of a grid? Basicly I have a grid and when the user selects a row(s) I want to have the selected data update a chart on the page.
Thanks,
Erik
I am trying to use a datepicker in a grid column that utilizes InCell editing. The problem I am having is that the datepicker appears to revert back to the specified default value after I remove the focus from the datepicker cell into another cell. Another interesting thing to note is that I can click back into the datepicker cell that I changed and the datepicker will once again show the correct date that I changed the cell too. Any ideas what causes this behavior?
Here is the date snippet from my viewmodel:
[DisplayName(
"Month/Year"
)]
[DisplayFormat(DataFormatString =
"{0:MMMM yyyy}"
)]
[DataType(DataType.Date)]
[Required]
public
DateTime FOBDate {
get
;
set
; }
Here is my Date.cshtml code:
@model DateTime?
@(Html.Kendo().DatePickerFor(m => m)
.Name(
"fobpricedate"
)
.Format(
"MMMM yyyy"
)
.Start(CalendarView.Year)
.Depth(CalendarView.Year)
)
And here is my view that contains the grid:
@(Html.Kendo().Grid<TestMACPortal.Models.FOBViewModel>()
.Name(
"grid"
)
.Columns(columns =>
{
columns.Bound(c => c.Category).ClientTemplate(
"#=Category.CategoryName#"
);
//.EditorTemplateName("ProductCategory");
columns.Bound(c => c.SKU_Name);
columns.Bound(c => c.MaterialNumber);
columns.Bound(c => c.Company).ClientTemplate(
"#=Company.CompanyName#"
);
columns.Bound(c => c.FOBDate).EditorTemplateName(
"Date"
);
columns.Bound(c => c.Price).EditorTemplateName(
"Price"
);
})
.ToolBar(toolbar =>
{
toolbar.Create();
//toolbar.Save();
})
.Editable(editable => editable.Mode(GridEditMode.InCell))
.HtmlAttributes(
new
{ style =
"height: 500px;"
})
.Scrollable()
.Sortable()
.Groupable()
.Resizable(resize => resize.Columns(
true
))
//.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(
true
)
.ServerOperation(
false
)
.Events(events => events.Error(
"error_handler"
))
.Model(model =>
{
model.Id(c => c.FOBID);
model.Field(c => c.FOBID).Editable(
false
);
model.Field(c => c.Category).DefaultValue(ViewData[
"defaultCategory"
]
as
TestMACPortal.Models.ProductCategoryViewModel);
model.Field(c => c.Company).DefaultValue(ViewData[
"defaultCompany"
]
as
TestMACPortal.Models.CompanyViewModel);
model.Field(c => c.FOBDate).DefaultValue(DateTime.Today);
})
//.Destroy("Editing_Destroy", "FOB")
.Read(read =>
{
read.Action(
"GetFOBs"
,
"FOB"
);
})
//.Create("CreateFOB", "FOB")
//.Update("UpdateFOB", "FOB")
)
)
I have a grid control which is bound to the model I have passed it in the view (local data):
HireReport.cshml
@model ReportingPortalWeb.Models.HireReportViewModel
@(Html.Kendo().Grid(Model.StockReport)
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.SohQty).Title("Quantity").Visible(Model.StockReport.Sum(t => t.SohQty) > 0);
...
I want to add the export to excel function but this seems limited to remote data
.ToolBar(tools => tools.Excel())
...
Is there no way to bind this to the local model data?
I would like to implement a drill through type action on a bar charts series.
Here is what i have so far:
@(Html.Kendo().Chart<
BetaSMTRApp.Business.PrivateReportCardCumulativeInvestments
>()
.Name("ChartInvestmentCumulations_" + item.FUND_INT.ToString())
//.Title("Cumulative Investments")
.Legend(legend => legend
.Position(ChartLegendPosition.Top)
)
.DataSource(dataSource => dataSource
.Read(read => read.Action("GetCumulativeInvestments", "PrivateReportCard", new { fundInt = item.FUND_INT }))
)
.Series(series =>
{
series.Column(model => model.Commitments).Name("Commitments").Color("Red");
series.Column(model => model.Distributions).Name("Distributions").Color("Green");
series.Column(model => model.Draw_Down).Name("DrawDowns").Color("Yellow");
series.Column(model => model.Fees).Name("Fees").Color("Brown");
})
.CategoryAxis(axis => axis
.Categories(model => model.YearCategory)
)
.ValueAxis(axis => axis.Numeric()
.Labels(labels => labels
.Format("${0}")
)
)
.Tooltip(tooltip => tooltip
.Visible(true)
.Template("#= series.name #: #= value #")
)
.Events (events=>events.SeriesClick("onSeriesClick"))
)
Javascript/JQuery
function
onSeriesClick(e) {
$(
"#window"
).data(
"kendoWindow"
).open();
$(
"#undo"
).hide();
};
Kendo Window
@(Html.Kendo().Window()
.Name("window")
.Title("About Alvar Aalto")
.Content(@<
text
>
<
div
class
=
"armchair"
>
<
img
src
=
"@Url.Content("
~/content/web/window/armchair-402.png")"
alt
=
"Artek Alvar Aalto - Armchair 402"
/>
Artek Alvar Aalto - Armchair 402
</
div
>
<
p
>
Alvar Aalto is one of the greatest names in modern architecture and design.
Glassblowers at the iittala factory still meticulously handcraft the legendary
vases that are variations on one theme, fluid organic shapes that let the end user
ecide the use. Interpretations of the shape in new colors and materials add to the
growing Alvar Aalto Collection that remains true to his original design.
</
p
>
<
p
>
Born Hugo Alvar Henrik Aalto (February 3, 1898 - May 11, 1976) in Kuortane, Finland,
was noted for his humanistic approach to modernism. He studied architecture at the
Helsinki University of Technology from 1916 to 1921. In 1924 he married architect
Aino Marsio.
</
p
>
<
p
>
Alvar Aalto was one of the first and most influential architects of the Scandinavian
modern movement, and a member of the Congres Internationaux d'Architecture Moderne.
Major architectural works include the Finlandia Hall in Helsinki, Finland,
and the campus of Helsinki University of Technology.
</
p
>
<
p
>
Source:
<
a
href
=
"http://www.aalto.com/about-alvar-aalto.html"
title
=
"About Alvar Aalto"
>www.aalto.com</
a
>
</
p
>
</
text
>)
.Draggable()
.Resizable()
.Visible(false)
.Width(600)
.Actions(actions => actions.Pin().Minimize().Maximize().Close())
)
Oh and yes i know that the window is displaying static text... i will eventually be putting in a Grid to display the detail records (and question #2 relates to it)
Here are my 2 issues/questions:
1. The window does pop up when i click on a series. However the page behind it goes white and only the contents of the window appear. Is there a way to allow the calling web page still appear (and not go blank).
2. In the javascript call to open the window is it possible to pass the contents of e to it (e contains parameter values that i want to use in the pop up window).
Thanks,
Corey
I have a kendo grid that gets data remotely (because I use the export to excel functionality). The column headers are bound to my model which is passed as empty before the data source request gets the populated one.
@model ReportingPortalWeb.Models.HireReportViewModel
@(Html.Kendo().Grid<StockReport>()
.Name("grid")
.Columns(columns =>
{
columns.Bound(p => p.SohQty).Title("Quantity");
columns.Bound(p => p.StockName);
...
columns.Bound(p => p.SiteAddress3);
columns.Bound(p => p.PostCode);
})
.ToolBar(tools => tools.Excel())
.Groupable()
.Excel(excel => excel
.FileName("Kendo UI Grid Export.xlsx")
.Filterable(true)
.ProxyURL(Url.Action("CustomReport_Data", "Reports"))
)
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("CustomReport_Data", "Reports").Data("GetData")))
.Pageable()
.Sortable()
.Scrollable()
.Filterable()
.HtmlAttributes(new {style = "height:550px;"})
)
Before having to use the excel export I passed the data when the gird was created and I could hide a column easily by doing something like
columns.Bound(p => p.PrCode).Visible(Model.StockReport.Count(t => t.PrCode.Any()) > 0);
now that I am remotely fetching the data instead, is there a data on load event that I can use to hide the columns in my report that don't have any data in them?
Hello,
I have seen examples of confirmation boxes applied to inline / cell editing.
How can I display a confirmation ("saved successfully" or "not saved successfully" using something like notification widget if the grid batch editing mode is used?
The Save command is calling the controller action for Save and returns a JSON request as a response. But I don't know yet to get the additional notifaction displayed.
Yours
Stephan