DevExpress MVC Gridview
Добрый день, ребята, я пытаюсь добавить дополнительный столбец в виде сетки с этим кодом. Но когда я запускаю это. Я не могу нажать кнопку в виде сетки. Понял, что я делаю не так. Спасибо
settings.Columns.Add(column =>
{
column.FieldName = "Unbound";
column.Caption = "Action";
column.UnboundType = DevExpress.Data.UnboundColumnType.Object
column.EditFormSettings.Visible = DevExpress.Utils.DefaultBoolean.True;
column.ReadOnly = false;
column.SetDataItemTemplateContent((c) =>
{
Html.DevExpress().Button(b =>
{
b.Name = "btnVE" + c.KeyValue;
b.Text = "V/E";
b.ClientSideEvents.Click =
"function(s, e) { document.location='" + DevExpressHelper.GetUrl(new { Controller = "ViewPrincipal", Action = "EditRecord" })
+ "?key=' + s.GetRowKey(e.visibleIndex); }";
}).GetHtml();
});
});
settings.Columns.Add("Id");
settings.Columns.Add("Code");
settings.Columns.Add("CompanyId");
settings.Columns.Add("Description");
settings.Columns.Add("ContactPerson");
settings.Columns.Add("TelNo");
settings.Columns.Add("Notes");
Обновление: я нашел ошибку в сети с помощью инструментов веб-разработчика, но я не знаю, как ее исправить.
2 ответа
Похоже, проблема возникла из s
который назначен отправителю кнопки в этом блоке вместо GridView
строка:
Html.DevExpress().Button(b =>
{
b.Name = "btnVE" + c.KeyValue;
b.Text = "V/E";
b.ClientSideEvents.Click =
"function(s, e) { document.location='" + DevExpressHelper.GetUrl(new { Controller = "ViewPrincipal", Action = "EditRecord" })
+ "?key=' + s.GetRowKey(e.visibleIndex); }"; // ==> 's' refers to button object as sender
}).GetHtml();
То, что вы должны использовать, это GridViewDataItemTemplateContainer
объект, чтобы получить KeyValue
свойство для соответствующей строки, которая возвращает целочисленное значение из GridViewBaseRowTemplateContainer
:
column.SetDataItemTemplateContent((c) =>
{
Html.DevExpress().Button(b =>
{
b.Name = "btnVE" + c.KeyValue;
b.Text = "V/E";
b.UseSubmitBehavior = false; // prevent default submit action
b.EnableClientSideAPI = true; // add this line if not sure
b.ClientSideEvents.Click =
"function(s, e) { window.location = '" + DevExpressHelper.GetUrl(new { Controller = "ViewPrincipal", Action = "EditRecord" })
+ "?key=" + c.KeyValue.ToString() + "'; }";
}).GetHtml();
});
Или используя string.Format()
который легче читать:
b.ClientSideEvents.Click = string.Format("function(s, e) {{ window.location = '{0}?key={1}'; }}",
DevExpressHelper.GetUrl(new { Controller = "ViewPrincipal", Action = "EditRecord" }),
c.KeyValue.ToString());
Заметки:
1) Если вы хотите получить индекс строки, используйте c.VisibleIndex
,
2) Для кросс-браузерной заботы я предпочел window.location
в document.location
как предусмотрено здесь.
Связанная проблема: GridView - Как определить кнопку внутри сетки
Нашел проблему. По-видимому, это должно быть размещено в передней части вида перед созданием вида сетки. Но я думал, что это должен быть JScript. Он должен работать асинхронно. Ооо хорошо, пока это работает. Спасибо за помощь @tetsuya
@Html.DevExpress().GetStyleSheets(
new StyleSheet { ExtensionSuite = ExtensionSuite.NavigationAndLayout },
new StyleSheet { ExtensionSuite = ExtensionSuite.Editors, ExtensionType = ExtensionType.Button },
new StyleSheet { ExtensionSuite = ExtensionSuite.GridView }
)
@Html.DevExpress().GetScripts(
new Script { ExtensionSuite = ExtensionSuite.NavigationAndLayout },
new Script { ExtensionSuite = ExtensionSuite.Editors, ExtensionType = ExtensionType.Button },
new Script { ExtensionSuite = ExtensionSuite.GridView }
)