実行時に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関数をすべて含むようにしておきたいだけです。