Как динамически получать имена столбцов WebGrid

#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)...