как вы сортируете datatable заданный столбец и направление?

<p>мне нужно использовать в памяти datatable на основе столбца и направления, которые исходят из gridview. функция должна выглядеть так:</p><pre><code>public static datatable resort(datatable dt, string colname, string direction) { datatable dtout = null; .... } </code></pre><p>мне нужна помощь в заполнении этой функции. я думаю, что могу использовать оператор select, но я не уверен, как. я не могу нажать на комментарии из-за этого браузера, но вы можете показать мне на месте или новое решение datatable, либо одно. для людей, показывающих мне указатели, пожалуйста, мне нужна закодированная функция, похожая на ту, что была у прототипа.</p><p>как насчет:</p><pre><code>// ds.tables[0].defaultview.sort="au\_fname desc"; public static void resort(ref datatable dt, string colname, string direction) { string sortexpression = string.format("{0} {1}", colname, direction); dt.defaultview.sort = sortexpression; } </code></pre>

<p>я предполагаю, что "direction" - это "asc" или "desc", а dt содержит столбец с именем "colname"</p><pre><code>public static datatable resort(datatable dt, string colname, string direction) { datatable dtout = null; dt.defaultview.sort = colname + " " + direction; dtout = dt.defaultview.totable(); return dtout; } </code></pre><p>или без создания dtout</p><pre><code>public static datatable resort(datatable dt, string colname, string direction) { dt.defaultview.sort = colname + " " + direction; dt = dt.defaultview.totable(); return dt; } </code></pre>

<p>если у вас есть только один dataview, вы можете отсортировать его, используя вместо этого:</p><pre><code>table.defaultview.sort = "columnname asc"; </code></pre><p>не пробовал, но я думаю, что вы можете сделать это с любым количеством dataview, если вы ссылаетесь на правильный.</p>

<p>на самом деле получил ту же проблему. для меня это сработало так:</p><p>добавляем данные в <code>datatable</code> и сортируем их:</p><pre><code>dt.defaultview.sort = "columnname"; dt = dt.defaultview.totable(); </code></pre>

<p>datatables имеют перегруженный метод select, который вы можете сделать это. смотрите здесь: <a href="http://msdn.microsoft.com/en-us/library/way3dy9w.aspx">http://msdn.microsoft.com/en-us/library/way3dy9w.aspx</a> </p><p>но возвращаемое значение вызова select - это не datatable, а массив объектов rowdata. если вы хотите вернуть datatable из вашей функции, вам придется создавать его с нуля на основе этого массива данных. вот сообщение, в котором рассматривается и предоставляется образец для решения обеих проблем: <a href="http://social.msdn.microsoft.com/forums/en-us/winformsdatacontrols/thread/157a4a0f-1324-4301-9725-3def95de2bf2/">http://social.msdn.microsoft.com/forums/en-us/winformsdatacontrols/thread/157a4a0f-1324-4301-9725-3def95de2bf2/</a> </p>

<p>создайте <strong> dataview </strong>. вы не можете сортировать datatable напрямую, но вы можете создать dataview из datatable и отсортировать его.</p><p>создание: <a href="http://msdn.microsoft.com/en-us/library/hy5b8exc.aspx">http://msdn.microsoft.com/en-us/library/hy5b8exc.aspx</a> </p><p>сортировка: <a href="http://msdn.microsoft.com/en-us/library/13wb36xf.aspx">http://msdn.microsoft.com/en-us/library/13wb36xf.aspx</a> </p><blockquote> <p>в следующем примере кода создается представление, в котором показаны все продукты, в которых количество единиц на складе меньше или равно уровню заказа, отсортировано сначала по идентификатору поставщика, а затем по названию продукта.</p> </blockquote><p><code>dataview prodview = new dataview(prodds.tables["products"], "unitsinstock <= reorderlevel", "supplierid, productname", dataviewrowstate.currentrows);</code></p>

<p>если вы хотите сортировать в нескольких направлениях</p><pre><code> public static void sortoutputtable(ref datatable output) { dataview dv = output.defaultview; dv.sort = "specialcode asc, othercode desc"; datatable sorteddt = dv.totable(); output = sorteddt; } </code></pre>