0

実行時にDataTableを作成しています。私の目標は、最終的にGridViewに表示されるように画像をDataTableに挿入することです。ここでの答えは有望に見えましたが、私はそれをコピーしてVSに貼り付けましたが、それは単に機能しません。「機能しない」とは、GridViewにDataTableを表示するときに、画像を含むはずのセルに「System.Byte[]」という文字列が含まれていることを意味します。

これは、DataTableの構造と母集団の非常に簡略化されたバージョンです。

DataTable dt = new DataTable();
DataColumn imagecol = new DataColumn();
dt.Columns.Add(imagecol);

DataRow newrow;

for (int x = 0, x < 10; x++)
{
    newrow = dt.NewRow();
    newrow[imagecol] = *********
    dt.Add(newrow);
}

*の部分は私が失敗し続けるところです。

GridViewに.aspxフィールド(ImageField、TemplateFieldなど)を使用することは決してないので、.aspxコードを編集したり、特定の列を持つDataTableのGridViewを「準備」したりする必要のないソリューションを探しています。誰かが尋ねる前に答えさせてください。これの私の理由は次のとおりです。

A)プログラムで作成されたDataTableからGridViewを作成する方法を学んだだけです。

B)ある時点でフィールドを変更したい場合は、1か所ではなく2か所で編集する必要があります。

C)アプリケーションの他のすべてのページはこのスタイルを使用しているので、一貫性を保ちたいと思います。

だから私は何を試しましたか?


DataColumn imagecol = new DataColumn();
imagecol.DataType = System.Type.GetType("System.Byte[]");
//...
newrow[amountcol] = ReadImage(Server.MapPath("~/images/dashboard/myvacstatus-ampm.png"), new string[] { ".png" });

(ReadImage関数は画像をバイト配列に変換します)

結果:GridViewのフィールドに「System.Byte[]」というテキストが表示されます。


DataColumn imagecol = new DataColumn();
//...
newrow[amountcol] = ResolveUrl("~/images/dashboard/myvacstatus-ampm.png");

結果:GridViewのフィールドに「/images/dashboard/myvacstatus-ampm.png」というテキストが表示されます


DataColumn imagecol = new DataColumn();
//...
Image timeImg = new Image();
timeImg.ImageUrl = "/images/dashboard/myvacstatus-ampm.png"
newrow[amountcol] = timeImg;

結果:GridViewのフィールドに「System.Web.UI.WebControls.Image」というテキストが表示されます


私の最後の要件は、これが入るフィールドが画像または文字列である柔軟性を持たなければならないということです。これを視野に入れて/私がやろうとしていることを確認するために、これは休暇管理システム用です。休暇は通常、半日または終日かかります。両方のアイコンがあります。ただし、休暇がX時間続く場合もあります。したがって、ちょうど半日である場合、その行には半日の画像が必要です。1日である場合、その行には1日分の画像が必要です。時間が正確に半分でも完全でもない場合は、画像の代わりに、時間数をテキストとして配置する必要があります。

私がうまくいくと思う解決策の1つは、休暇の時間を非表示の列に入れ、RowDataBoundイベントで、時間の非表示の値を使用して必要な画像またはテキストを作成し、次のように言うことです。

e.Row.Cells[3].Controls.Add(myImage);

コードが再び分割されるため、これは好きではありません。Cellsインデックスが何であるかを常に知っている必要があります。本当に、BuildDataTable関数をすべて含むようにしておきたいだけです。

4

1 に答える 1

2

編集:質問を読み直した後、回答を完全に書き直してください。

あなたは次のように述べています。

GridViewに.aspxフィールド(ImageField、TemplateFieldなど)を使用することはないので、.aspxコードを編集する必要のないソリューションを探しています...

使用したいだけならAutoGenerateColumns="false"、GridViewに画像を表示することはできないと思います。

画像を表示するために、レンダリングされたページには画像タグが必要です。CSSデータのURLをいじり始めない限り、それを回避する方法はありません。

非常に複雑に聞こえ、とにかくすべてのブラウザで機能するとは限らない要件について。

画像を表示するには、手動で設定する必要があると思いますGridView。開始点として使用できる完全な実例を次に示します(プロジェクトに一致するように画像のURLを調整する必要があります)。

aspxファイル

<asp:GridView ID="example" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="Some other field" DataField="SomeOtherField" />
        <asp:TemplateField HeaderText="Image/Text">
            <ItemTemplate>
                <asp:Image ID="FullDay" runat="server" Visible='<%# ((int)Eval("HoursField")) == this.FullDayHours %>'
                    ImageUrl="~/images/dashboard/fullDayImage.png" />
                <asp:Image ID="HalfDay" runat="server" Visible='<%# ((int)Eval("HoursField")) == this.HalfDayHours %>'
                    ImageUrl="~/images/dashboard/halfDayImage.png" />
                <asp:Literal ID="ShowHours" runat="server" Visible='<%# ((int)Eval("HoursField")) != this.HalfDayHours  && ((int)Eval("HoursField")) != this.FullDayHours %>'
                    Text='<%# Eval("HoursField") %>'></asp:Literal>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

ファイルの背後にあるコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Data;

public partial class GridViewTest : System.Web.UI.Page
{
    public readonly int FullDayHours = 8;
    public readonly int HalfDayHours = 4;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable gridViewSource = new DataTable();

            DataColumn oneColumn = new DataColumn("SomeOtherField");
            oneColumn.DataType = System.Type.GetType("System.String");
            gridViewSource.Columns.Add(oneColumn);

            oneColumn = new DataColumn("HoursField");
            oneColumn.DataType = System.Type.GetType("System.Int32");
            gridViewSource.Columns.Add(oneColumn);

            for (int i = 0; i < 10; i++)
            {
                DataRow oneRow = gridViewSource.NewRow();
                oneRow["SomeOtherField"] = "Other field " + i.ToString();
                oneRow["HoursField"] = i;
                gridViewSource.Rows.Add(oneRow);
            }
            example.DataSource = gridViewSource;
            example.DataBind();
        }
    }
}
于 2012-07-04T08:26:11.760 に答える