在gridview中向imageButton添加功能

时间:2011-05-02 17:19:22

标签: c# asp.net

我有一个ImageButton控件作为GridView控件的一部分,显示为ItemTemplate并位于同一个GridView中。我有一个常规的Button控件,我添加了一些这样的代码

if (e.CommandName == "addToSession")
{
    int index = Convert.ToInt32(e.CommandArgument);

    GridViewRow selectedRow = ((GridView)e.CommandSource).Rows[index];

    string ISBN = selectedRow.Cells[0].Text;
    string bookTitle = selectedRow.Cells[1].Text;
    string image = selectedRow.Cells[2].Text;

    //storing title, author, pictureUrl into session variables to 'carry them over' to RateBook.aspx
    Service s = new Service();
    Session["ISBN"] = ISBN;
    Session["bookTitle"] = bookTitle;
    Session["ImageUrl"] = s.returnImageUrl(bookTitle);

    if (Session["userName"] == null)
    {
        Response.Redirect("registerPage.aspx");
    }
    else
    {
        Response.Redirect("RateBook.aspx");
    }
}
else if (e.CommandName == "ratedBooks")
{
    int index = Convert.ToInt32(e.CommandArgument);

    GridViewRow selectedRow = ((GridView)e.CommandSource).Rows[index];

    string bookTitle = selectedRow.Cells[1].Text;

    Service s = new Service();

    Session["ImageUrl"] = s.returnImageUrl(bookTitle);

    Response.Redirect("BookRated.aspx");
}

当我运行此代码时,我得到格式异常,我不知道为什么。我稍微改变了图像按钮并将图像嵌套在链接按钮中,这似乎更正确。

<asp:TemplateField>
    <ItemTemplate>
        <asp:LinkButton ID="LinkButton1" runat="server" CommandName="ratedBooks">
            <asp:Image ID="ImageButton1" ImageUrl='<%#Eval("pictureUrl") %>' runat="server" />   

        </asp:LinkButton>    
    </ItemTemplate>
</asp:TemplateField>

请告知。

此致

阿里安

3 个答案:

答案 0 :(得分:1)

一种可能的解决方案是添加ItemDataBound事件处理程序并搜索图像按钮更改其图像URL。

MyGrid.RowDataBound += new RepeaterItemEventHandler(MyGrid_RowDataBound);

void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex > -1)
        {
            ImageButton image = e.Row.FindControl("MY_IMAGE_CONTROL") as ImageButton;

            image.ImageUrl = "PATH_TO_IMAGE";
        }
    }

希望它有所帮助。

答案 1 :(得分:1)

我相信您可以使用ImageButton来满足您的需求,因为它支持所有主要Button功能,包括CommandName(请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.imagebutton.commandname.aspx)。

试试这个:

    <asp:ImageButton ID="LinkButton1" runat="server"
                     CommandName="ratedBooks"
                     ImageUrl='<%#Eval("pictureUrl") %>' />

另请注意,您的格式异常可能来自以下行:

Convert.ToInt32(e.CommandArgument);

原因是这段代码片段中没有为按钮的CommandArgument分配值。 Convert.ToInt32需要传入有效的整数值,这意味着ImageButton需要有一个绑定到其CommandArgument属性的数字。

如果您的解决方案基于此MSDN参考(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewcommandeventargs.aspx),请注意<asp:ButtonField>列类型会得到特殊处理; CommandArgument设置为行索引。当您使用模板字段时,ASP.NET要求您指定或数据绑定您自己的命令参数。

<强>更新

此问题包含有关将网格视图行索引绑定到自定义按钮的详细信息:

ASP.NET GridView RowIndex As CommandArgument

答案 2 :(得分:0)

您需要CommandArgument

<asp:TemplateField ShowHeader="False">
<ItemTemplate>
    <asp:ImageButton ID="ImageButton1" runat="server" CommandName="Delete" CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"                                                                             ImageUrl="~/Modelos/Img/deleted.gif" />
</ItemTemplate>
</asp:TemplateField>

C#背后的代码

public void GridView_RowCommand(Object sender, GridViewCommandEventArgs e)
        {
            string t;
            if (e.CommandName == "Delete")
            {
                int index = Convert.ToInt32(e.CommandArgument);
                GridViewRow selectedRow = grid1.Rows[index];
                t = selectedRow.Cells[2].Text;
            }
        }

在ASPX上

<asp:GridView ID="grid1" runat="server" onselectedindexchanged="GridView1_SelectedIndexChanged" ...