How To Dynamic Columns From Array
How To Dynamic Columns From Array

Hi guys, my name is adi
I started using this plugin and I need your help.
I don't know how to display dynamic columns from data arrays
This is my code:
RESULT COLUMN ARRAY

HTML
<table class="table table-hover" id="collar">
</table>
JAVASCRIPT
$(document).ready(function () {
var columns = []; // array
var response = null;
$('#btn-show-collar').click(function () {
$('#collar').DataTable({
"processing": true,
"serverSide": true,
"ajax": function (data, callback, settings) {
$.ajax({
url: '/HO/DrillHole/CollarGetAll',
type: 'POST',
data: data,
success: function (data) {
response = data.data;
$.each(response[0], function (key, value) {
var my_item = {};
my_item.title = key;
my_item.data = key;
columns.push(my_item);
});
//console.log(response);
callback(data);
}
})
},
"data": response,
"columns": columns
});
});
}
SERVER SIDE C#
public class DataTableParamObject
{
public int draw { get; set; }
public List<Column> columns { get; set; }
public List<Order> order { get; set; }
public int start { get; set; }
public int length { get; set; }
public Search search { get; set; }
}
public class Column
{
public string data { get; set; }
public string name { get; set; }
public bool searchable { get; set; }
public bool orderable { get; set; }
public Search search { get; set; }
}
public class Search
{
public string value { get; set; }
public bool regex { get; set; }
}
public class Order
{
public int column { get; set; }
public string dir { get; set; }
}
public object GetDataTable(DataTableParamObject param)
{
// Get all mandatory fields
var fieldNames = typeof(HoleLocation).GetProperties().Where(f => f.Name.ToUpper() != "CREATEDDATE"
&& f.Name.ToUpper() != "CREATEDBY"
&& f.Name.ToUpper() != "PROJECT"
&& f.Name.ToUpper() != "TENEMENT"
&& f.Name.ToUpper() != "HOLETYPE"
&& f.Name.ToUpper() != "GRIDNAME"
&& f.Name.ToUpper() != "ITEM")
.Select(f => f.Name).ToList();
// get all HoleLocation
var holeLocations = _dbContext.HoleLocation.ToList();
var search = param.search.value ?? "";
var totalRecord = holeLocations.Count();
var result = holeLocations.Where(c =>
c.HoleId.Contains(search, StringComparison.InvariantCultureIgnoreCase) ||
c.ProjectCode.Contains(search, StringComparison.InvariantCultureIgnoreCase) ||
c.TenementId.Contains(search, StringComparison.InvariantCultureIgnoreCase) ||
c.HoleTypeId.Contains(search, StringComparison.InvariantCultureIgnoreCase));
switch (param.order[0].column)
{
case 1:
if (param.order[0].dir.Equals("asc"))
{
result = result.OrderBy(c => c.HoleId);
}
else
{
result = result.OrderByDescending(c => c.HoleId);
}
break;
case 2:
if (param.order[0].dir.Equals("asc"))
{
result = result.OrderBy(c => c.ProjectCode);
}
else
{
result = result.OrderByDescending(c => c.ProjectCode);
}
break;
case 3:
if (param.order[0].dir.Equals("asc"))
{
result = result.OrderBy(c => c.TenementId);
}
else
{
result = result.OrderByDescending(c => c.TenementId);
}
break;
case 4:
if (param.order[0].dir.Equals("asc"))
{
result = result.OrderBy(c => c.HoleTypeId);
}
else
{
result = result.OrderByDescending(c => c.HoleTypeId);
}
break;
}
result = result.Skip(param.start).Take(param.length);
// get all HoleCode
List<HoleCode> holeCodes = _dbContext.HoleCode.ToList();
List<object> holelocationList = new List<object>();
foreach (HoleLocation holeLocation in result)
{
dynamic holeLocationObject = new ExpandoObject();
foreach (string fieldName in fieldNames)
{
string val = holeLocation[fieldName] != null ? holeLocation[fieldName].ToString() : "";
((IDictionary<String, Object>)holeLocationObject)[fieldName] = string.IsNullOrEmpty(val) ? "" : val;
}
foreach (HoleCode holeCode in holeCodes)
{
try
{
HoleDetails holeDetail = _dbContext.HoleDetails.Where(td => td.Name == holeCode.Name).FirstOrDefault();
((IDictionary<String, Object>)holeLocationObject)[holeDetail.Name] = holeDetail == null || string.IsNullOrEmpty(holeDetail.Value) ? "" : holeDetail.Value;
}
catch (Exception)
{
}
}
holelocationList.Add(holeLocationObject);
}
return new
{
draw = param.draw,
recordsTotal = holelocationList.Count(),
recordsFiltered = totalRecord,
data = holelocationList
};
}
I use the code above the results like this

This discussion has been closed.
Answers
Hi @adiirawan ,
This thread should help, it's asking the same thing.
Cheers,
Colin