2

一部の行に写真が添付されているグリッド ビューがあります。Button2 を押すと、SQL レコードから、サーバー上のどのフォルダーに画像があるかに関する情報を取得します。これは既に機能していますが、画像フォルダーが添付されている行にのみボタンを表示することはできません。

私は長い間グーグルで検索して、次のようなさまざまな解決策を見つけましたが、うまくいきません。私は何を間違っていますか?

<asp:SqlDataSource ID="SqlDSodinRSSfeb" runat="server" 
    ConnectionString="<%$ ConnectionStrings:herning_brand_dk_dbConnectionString %>"                 
    SelectCommand="SELECT PubDateTime, Melding, Station, PhotoFolder FROM OdinRSS ">
</asp:SqlDataSource>    
<asp:GridView ID="GridView14" runat="server" DataSourceID="SqlDSodinRSSfeb" 
    AutoGenerateColumns="False" Width="500px" OnRowCommand="Button_RowCommand" >
    <Columns>
        <asp:BoundField DataField="PubDateTime" HeaderText="Tidspunkt" />
        <asp:BoundField DataField="Melding" HeaderText="Melding for udkaldet" />
        <asp:BoundField DataField="Station" HeaderText="Station" />
        <asp:TemplateField HeaderText="Foto" >
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PhotoFolder") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Button ID="Button2" runat="server" Text="Foto" Visible='<%# Eval("PhotoFolder") != "Null" %>' 
                            CommandName="ButtonClick" CommandArgument='<%# Eval("PhotoFolder") %>'  />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

私の .cs

protected void Button_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandArgument != null)
    {
        switch (e.CommandName)
        {
            case "ButtonClick":
                {
                    int Folder = Convert.ToInt32(e.CommandArgument);
                    PhotoList(Folder);
                }
                break;
        }
    }
}

void PhotoList(int FolderNumber)
{
    var imagePaths = Directory.GetFiles(Server.MapPath("PhotoFolder\\" + FolderNumber));
    var imageNames = new string[imagePaths.Length];

    for (int i = 0; i < imagePaths.Length; i++)
    {
        imageNames[i] = imagePaths[i].Substring(imagePaths[i].LastIndexOf("\\") + 1);
    }

    var dt = new DataTable();
    dt.Columns.Add("ImageName", typeof(string));
    dt.Columns.Add("ImagePath", typeof(string));

    foreach (var imgName in imageNames)
    {
        DataRow dr = dt.NewRow();
        dr["ImageName"] = RemoveExtension(imgName);
        dr["ImagePath"] = "PhotoFolder/" + FolderNumber + "/" + imgName;
        dt.Rows.Add(dr);
    }
    DataList1.DataSource = dt;
    DataList1.DataBind();
}

string RemoveExtension(string imgName)
{
    return imgName
                .Replace(".jpg", "")
                .Replace(".png", "");
}

SQL フィールド「PhotoFolder」は nvarchar(50) です。記録用の写真がある場合、フィールドには 100 以上の番号があり、写真を含むフォルダーを参照します。記録用の写真がない場合、フィールドには「Null」が含まれます

私も試しました:

   <asp:Button ID="Button2" runat="server" Text="Foto" Visible='<%# Eval("PhotoFolder").ToString() != "Null" %>'

ただし、ボタンは「PhotoFolder」に文字列(数字)がある行だけでなく、すべての行に表示されます

4

4 に答える 4

2

インラインコードで簡単に実現できます

<asp:ImageButton ID="ibtnBranchType1" runat="server" ImageUrl='<%# "~/images/" + Eval("branchtype1")+".png" %>' Visible='<%# Convert.ToString(Eval("branchtype1"))=="" ? false : true %>'  Height="20px"/>

ここで Eval("branchtype1") は、1、2、3 などのデータ テーブルから id の値を取得しており、画像フォルダーは 1.png、2.png、3.png などの画像で構成されています。

Visible='<%# Convert.ToString(Eval("branchtype1"))=="" ? false : true %>'

値に ID が含まれていない場合は、null になります。三項演算子を使用して空の文字列と比較します。

于 2014-06-02T08:47:14.093 に答える
1

これを試して。

マークアップ

Visible='<%# HideEmptyPhotoFolder(Eval("PhotoFolder")) %>'

コードビハインド

protected bool HideEmptyPhotoFolder(object photoFolder)
{
    return photoFolder != null && !String.IsNullOrEmpty(photoFolder.ToString());
}
于 2013-02-15T11:18:00.443 に答える
0

質問に従って、画像を含む行をチェックするためのコードを作成する必要があります。RowDatabound イベントにコードを記述し、画像を含まない行でボタンの表示プロパティを false に設定できます。

于 2013-02-15T11:13:23.650 に答える
0

GridView RowDataBound イベントで簡単に実行できます。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

于 2013-02-15T11:17:33.517 に答える