Use Linq. Cast the ADO.NET DataTable's Columns to Linq-able DataColumn. If you are using Flexigrid or jqGrid, use the following:
On Controller, use this:
public class HomeController : Controller { // // GET: /Home/ // public string TableName = "INFORMATION_SCHEMA.COLUMNS"; public string TableName = "Country"; public ActionResult Index() { ViewBag.Columns = TheColumns(TableName); return View(); } public JsonResult List(int page, int rp) { int offset = (page - 1) * rp; var da = new SqlDataAdapter( string.Format( @" with a as ( select ROW_NUMBER() over(order by {0}) - 1 as r, * from {1} ) select * from a where r between {2} and {3}", TheColumns(TableName)[0].ColumnName, TableName, offset, offset + rp - 1), TheConnection()); var dt = new DataTable(); da.Fill(dt); var jsonData = new { page = page, total = RowCount(TableName), rows = dt.Select() .Select(row => new { // 0 is row number, 1 is the primary key id = row[1].ToString(), // don't include row number and primary key on display, it is in Ordinal 0 and 1 respectively cell = dt.Columns.Cast<DataColumn>().Where(col => col.Ordinal > 1) .Select(col => row[col.ColumnName].ToString()) } ) }; return Json(jsonData); } long RowCount(string tableName) { return (long)new SqlCommand("select count_big(*) from " + tableName, TheConnection()).ExecuteScalar(); } DataColumnCollection TheColumns(string tableName) { var da = new SqlDataAdapter("select * from " + TableName + " where 1 = 0", TheConnection()); var dt = new DataTable(); da.Fill(dt); return dt.Columns; } SqlConnection TheConnection() { var c = new SqlConnection("Data Source=localhost; Initial Catalog=OkSystem; User Id=sa; Password=P@$$w0rd"); c.Open(); return c; } }
Then on View, use this:
@using System.Data; <script src="/Scripts/jQuery/jquery-1.4.4.min.js" type="text/javascript"></script> <link href="/Scripts/flexigrid/flexigrid.css" rel="stylesheet" type="text/css" /> <script src="/Scripts/flexigrid/flexigrid-google-minified-simple.js" type="text/javascript"></script> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <table id="theNavigation"></table> @{ int i = 0; } <script type="text/javascript"> $(function() { $('#theNavigation').flexigrid({ url: '/Home/List', dataType: 'json', colModel: [ @foreach (DataColumn c in ViewBag.Columns) { ++i; if (i == 1) { continue; // skip primary key } <text>{ display: '@c.ColumnName', name: '@c.ColumnName', width: 100}@(i != ViewBag.Columns.Count ? "," : "")</text> } ], singleSelect: true, usepager: true, title: 'Sample Dynamic', useRp: true, rp: 5, showTableToggleBtn: true, width: 680, height: 200 }); //flexigrid $('#theNavigation').click(function() { alert('A'); var items = $('.trSelected', this); alert(items.length); if (items.length == 1) { var pk = items[0].id.substring(3); alert(pk); } }); }); </script>
There's no model, columns are dynamic, obtained from ADO.NET DataTable :-)
Is very Good Brother!!!!...tks.
ReplyDelete