0

Data listこの質問は、数日前に投稿した同様の質問に関連しています。カテゴリを表示するデータリストがあり、カテゴリ内のドキュメントがあります。必要なのは、各カテゴリのドキュメントが、ファイル名の数字に基づいた順序で表示されることです。ドキュメントは、「001-ファイル名.pdf」、「002-ファイル名.pdf」...「00x-ファイル名.pdf」のような形式です。最初のダッシュをある種の「分割」関数として使用し、「001」などの数字を取得してソートを機能させることができます。これは、SQL 構文または SQL 構文で実行できると思いitemdataboundます。関連するコードをここに投稿しています。これをどのように機能させることができるかについてのアイデアはありますか? 「001-filename.pdf」、「001-filenameversion2.pdf」など、共有番号プレフィックスを持つ複数のドキュメントが存在する可能性があります。

ASPX:

<asp:DataList ID="DataList1" runat="server" RepeatDirection="Vertical" DataKeyField="docid"
    EnableViewState="True" OnItemDataBound="DataList1_ItemDataBound">
    <ItemTemplate>
        <table cellpadding="0" cellspacing="0" id="tbl_data">
            <tr runat="server" id="tr_category">
                <td>
                    <asp:Label ID="lblHeader" runat="server" Font-Bold="True" Text='<%# Eval("categoryname") %>'
                        Font-Underline="True"></asp:Label>
                    <asp:Label runat="server" ID="lbl_cb_all">Select All
                        <asp:CheckBox runat="server" OnCheckedChanged="CheckAllChanged" AutoPostBack="true"
                            ID="cb_selectall" />
                    </asp:Label>
                    <asp:HiddenField ID="HiddenCatID" runat="server" Value='<%# Eval("CatID") %>' />
                    <asp:HiddenField ID="HiddenDocID" runat="server" Value='<%# Eval("docid") %>' />
                </td>
            </tr>
            <tr runat="server" id="tr_data">
                <td>
                    <asp:CheckBox runat="server" ID="cb_docid" Value='<%# Eval("docid") %>' OnCheckedChanged="displayselectedinit"
                        AutoPostBack="true" />
                    <asp:HyperLink ID="hpl_docfileencr" Text='<%# Eval("docfileencr") %>' NavigateUrl='<%# "~/PDFEncr/" + DataBinder.Eval(Container.DataItem, "docfileencr") %>'
                        Target="_blank" runat="server" />
                    <br />
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:DataList>

C# コードビハインド:

sqlsyntax = @"SELECT  dbo.projectsdocuments.docfileencr,dbo.categories.catid, dbo.categories.categoryname, dbo.projectsdocuments.docid
              FROM dbo.Projects INNER JOIN dbo.projectsdocuments ON (dbo.Projects.projectid = dbo.projectsdocuments.projectid)
              INNER JOIN dbo.categories ON (dbo.projectsdocuments.categoryid = dbo.categories.catid)
              WHERE  Projects.projectid = " + projectid + " ORDER BY dbo.categories.sortorder ASC";

protected void DataList1_ItemDataBound(Object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var row = (DataRowView)e.Item.DataItem;
        var view = row.DataView;
        var lastRow = e.Item.ItemIndex == 0 ? null : view[e.Item.ItemIndex - 1];
        var tr_category = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl("tr_category");
        var sameCategory = lastRow != null && (int)row["catid"] == (int)lastRow["catid"];
        tr_category.Visible = !sameCategory;
    }
}
4

1 に答える 1

1

ORDER BY を変更して、両方の列を含めます。

SELECT  
    dbo.projectsdocuments.docfileencr,
    dbo.categories.catid, 
    dbo.categories.categoryname, 
    dbo.projectsdocuments.docid
FROM dbo.Projects 
INNER JOIN dbo.projectsdocuments 
    ON (dbo.Projects.projectid = dbo.projectsdocuments.projectid)
INNER JOIN dbo.categories 
    ON (dbo.projectsdocuments.categoryid = dbo.categories.catid)
WHERE  Projects.projectid = " + projectid + "
ORDER BY dbo.categories.sortorder, dbo.projectsdocuments.docfileencr

優先順位は左から右です。デフォルトは「ASCENDING」ですが、「ASC または DESC」を直後に追加することで、特定の列の並べ替えを変更できます。

** 重要な注意点 **

文字列連結を行っているため、コードはSQL インジェクションの影響を受けやすくなっています。これが懸念される場合は、コマンド パラメーターを使用して割り当てる名前付きパラメーターを使用するように SQL ステートメントを変更します (以下の例を参照)。

ステップ 1: インライン文字列パラメータを名前付きパラメータ「@projectid」に変更します。

SELECT  
    dbo.projectsdocuments.docfileencr,
    dbo.categories.catid, 
    dbo.categories.categoryname, 
    dbo.projectsdocuments.docid
FROM dbo.Projects 
INNER JOIN dbo.projectsdocuments 
    ON (dbo.Projects.projectid = dbo.projectsdocuments.projectid)
INNER JOIN dbo.categories 
    ON (dbo.projectsdocuments.categoryid = dbo.categories.catid)
 WHERE  Projects.projectid = @projectid
 ORDER BY dbo.categories.sortorder, dbo.projectsdocuments.docfileencr

ステップ 2: パラメータをインラインで割り当てる (コード例)

using(SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();

    SqlCommand command = new SqlCommand(sql, conn);
    command.CommandType = CommandType.Text;

    // Assign the value projectid to the parameter @projectid
    command.Parameters.Add(new SqlParameter("@projectid", projectid));

    // Execute The Command (fill dataset, create datareader, etc...)
    SqlDataReader reader = command.ExecuteReader();
}
于 2012-04-18T17:08:42.357 に答える