#asp.net #webgrid #dynamic-columns
#asp.net #webgrid #динамические столбцы
Вопрос:
У меня есть таблица, в которой будет несколько фиксированных столбцов, а затем много динамических, в зависимости от того, как будут получены результаты pivot.
Итак, это работает просто отлично:
@{
var db = Database.Open("STUDENT");
var TeacherID = 15313;
var selectCommand = "PBIS_ReviewBehaviors @0, @1";
var selectedData0 = db.Query(selectCommand, TeacherID, 0);
var grid0 = new WebGrid(source: selectedData0, rowsPerPage: 30);
List<WebGridColumn> cols0 = new List<WebGridColumn>();
}
а затем тело:
<div>
@grid0.GetHtml(
tableStyle: "grid",
headerStyle: "head",
alternatingRowStyle: "alt"// ,
// columns: cols
)
</div>
однако я действительно хочу иметь возможность выполнять некоторые специфические действия с некоторыми из моих фиксированных столбцов — для этого мне нужно знать, кому получать имена столбцов в Data0 или Grid0, чтобы затем я мог создать список с именем cols и использовать его:
что-то вроде
foreach (column name in my grid)
{
if column name = "StudentID"
cols0.Add(grid0.column( format: @<a href="~/InsertStudent?StudentID=@item.StudentID">Details</a> );
else
cols0.Add(grid0.column( the column name );
}
Увы, я новичок в .net и не знаю, как я получаю свой список имен столбцов, а затем использую их конкретно. Надеюсь, я сделал псевдокод достаточно понятным для своих намерений.
Ответ №1:
Столбцы, возвращаемые запросом к базе данных, можно получить с помощью метода GetDynamicMemberNames.
foreach(var item in selectedData0.First().GetDynamicMemberNames()){
// assumes that the query will always return at least one row
// will throw an exception if not
// 'item' represents the column name
}
Ответ №2:
Спасибо!
работоспособное решение было:
try
{
foreach(var i in selectedData0.First().GetDynamicMemberNames() )
{
if(i == "StudentID") {
cols0.Add(grid0.Column(format: @<a href="~/DetailStudent?StudentID=@item.StudentID">Details</a>) );
}
else {
cols0.Add(grid0.Column(i.ToString()) );
}
}
}
catch {}
Это заменило мой первый столбец ссылкой на другую страницу и сохранило динамику остальных возвращенных данных. Поскольку возможно, что строки не возвращаются, я вставил try / catch.
Комментарии:
1. Вместо
try - catch
вы могли бы проверить значение null:if(selectedData0.FirstOrDefault() != null)...