希望从数组中的订单重新订购网页上的datalist

时间:2014-05-15 13:21:57

标签: c# asp.net datatable datalist

我在网页上找到了一个名为gvRoute的数据列表。这最初是按字母顺序排列的。

我正在考虑根据存储在OurOrder数组中的值重新排序这个数据列表 - 所以基本上,OurOrder [x]会说位置x(比如12)应该是第5行来自原始数据主义者。该订单已经通过在代码中的其他地方执行各种计算而获得。

我无法将其恢复到gvRoute数据列表中。我目前正在查看的代码如下:

int FromHere = 0;
int TotalRows = gvRoute.Items.Count;
DataTable dt = new DataTable();
DataTable dtcache = (DataTable)Session["MyTable"];
DataRow DRTransfer = dtcache.NewRow();
for (int x = 0; x < TotalRows - 1; x++)
{
    FromHere = OurOrder[x];
    DRTransfer = dtcache.Rows[FromHere];
    dt.ImportRow(DRTransfer);
}
gvRoute.DataSourceID = "";
gvRoute.DataSource = dt;
gvRoute.DataBind();

那么基本上(尝试)在这里发生的是我们找出各种默认值(我们需要多少行等)并构建一些新的数据表以进行传输,以及将使用的DRTransfer行来回转移。

然后,对于每一行,我们将找出gvRoute中应该存在哪一行,将其放入DRTransfer,然后将其添加到数据表dt。

一旦我们完成,我们将尝试将数据表dt绑定回gvRoute列表。

目前我认为除了实际将其重新列入清单之外,它几乎可以管理所有这些。 gvRoute数据列表包含各种字段,现在它们抱怨这些字段不存在。

编辑 - 它投掷的错误是......

DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'PKID_Operation'.

PKID_Operation是数据列表中遇到的第一个字段。

编辑 - 列表的asp代码是......

<asp:DataList ID="gvRoute" runat="server" DataKeyField="PKID_Operation" DataSourceID="DSRoute" GridLines="Both" RepeatColumns="1">
        <ItemTemplate>
            <asp:Label ID="FKID_ContractLabel" runat="server" Text='<%# Eval("FKID_Contract") %>' Visible="False" />
            <asp:Label ID="PKID_OperationLabel" runat="server" Text='<%# Eval("PKID_Operation") %>' Visible="False" />
            <asp:CheckBox ID="chkSel" runat="server" />
            <asp:Label ID="OperationOrderLabel" runat="server" Text='<%# Eval("OperationOrder") %>' />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Label ID="L1_NameLabel" runat="server" Text='<%# Eval("L1_Name") %>' />
            &nbsp;-
            <asp:Label ID="L2_NameLabel" runat="server" Text='<%# Eval("L2_Name") %>' />
            &nbsp;-
            <asp:Label ID="L3_NameLabel" runat="server" Text='<%# Eval("L3_Name") %>' />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            <asp:Label ID="Operation_NameLabel" runat="server" Text='<%# Eval("Operation_Name") %>' />
            &nbsp;-
            <asp:Label ID="Team_NameLabel" runat="server" Text='<%# Eval("Team_Name") %>' />
            &nbsp;(<asp:Label ID="PostcodeLabel" runat="server" Text='<%# Eval("Postcode") %>' />
            )<asp:Label ID="EmptyLabel" runat="server" Text='<%# Eval("Empty") %>' Visible="False" />
            &nbsp;&nbsp;&nbsp;&nbsp; (<asp:Label ID="Latitude" runat="server" Text='<%# Eval("Latitude") %>' />
            ,<asp:Label ID="Longitude" runat="server" Text='<%# Eval("Longitude") %>' />
            )<asp:Label ID="GeoOrder" runat="server" Text='<%# Eval("GeoOrder") %>' Visible="False" />
            <br />
        </ItemTemplate>
    </asp:DataList>

1 个答案:

答案 0 :(得分:1)

我认为问题是dt没有列。您需要在导入行之前添加列。可能有更好的方法来实现这一目标,但你可以试试这个:

int FromHere = 0;
int TotalRows = gvRoute.Items.Count;
DataTable dt = new DataTable();
DataTable dtcache = (DataTable)Session["MyTable"];
DataRow DRTransfer;

foreach (DataColumn column in dtcache.Columns)
{
    dt.Columns.Add(column.ColumnName, column.DataType);
}

for (int x = 0; x < TotalRows; x++)
{
    FromHere = OurOrder[x];
    DRTransfer = dtcache.Rows[FromHere];
    dt.ImportRow(DRTransfer);
}
gvRoute.DataSourceID = "";
gvRoute.DataSource = dt;
gvRoute.DataBind();