Как использовать изображения вместо текста для AutoGenerateEditButton в ASP.Net GridView - PullRequest
4 голосов
/ 19 июля 2010

Я использую AutoGenerateEditButton, а также Delete и Select.

Я хотел бы использовать изображения вместо текста для ссылок.

Как мне это сделать?

Я не хочу вручную создавать столбцы команд, поскольку свойства AutoGenerate используются во всем большом проекте, над которым я работаю.

Ответы [ 4 ]

5 голосов
/ 19 июля 2010

Самый простой способ сделать это - справиться со всем этим самостоятельно.Вот быстрый пример использования ImageButton для замены кнопки команды редактирования:

<asp:GridView ID="yourGrid" runat="server" OnRowEditing="yourGrid_RowEditing">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ImageButton ID="yourEditButton" runat="server"
                    CommandName="Edit" ImageUrl="edit.jpg" />
            </ItemTemplate>
            <EditItemTemplate>
                <!-- your edit controls here -->
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Теперь для кода:

protected void yourGrid_RowEditing(object sender, GridViewEditEventArgs e)
{
    // You could just do yourGrid and ignore casting the sender but this 
    // makes the code generic for reuse.
    GridView grid = (GridView)sender;   
    grid.EditIndex = e.NewEditIndex;
    BindData(); // need to rebind once the edit index is set.
}

Это в значительной степени заменяет автоматически сгенерированную кнопку редактированияс ImageButton.Установив CommandName для редактирования, он будет вызывать те же события, что и автоматически сгенерированная кнопка редактирования.Это также относится к удалению, обновлению и т. Д. *

3 голосов
/ 20 июля 2010

Подкласс элемента управления GridView и переопределение метода CreateChildControls

    protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
    {
        // re-use the AutoGenerate...Button properties
        bool showDelete = AutoGenerateDeleteButton;
        bool showEdit = AutoGenerateEditButton;
        bool showSelect = AutoGenerateSelectButton;

        // turn them all off, we'll be creating our own
        AutoGenerateDeleteButton = false;
        AutoGenerateEditButton = false;
        AutoGenerateSelectButton = false;

        // hide the column if it already exists
        if (Columns[0].GetType() == typeof(CommandField))
        {
            Columns.RemoveAt(0);
        }

        // add the command column if necessary
        if (showDelete || showEdit || showSelect)
        {
            CommandField cmdField = new CommandField();
            cmdField.HeaderText = string.Empty;
            cmdField.ButtonType = ButtonType.Image;
            cmdField.ShowSelectButton = showSelect;
            cmdField.ShowEditButton = showEdit;
            cmdField.ShowDeleteButton = showDelete;
            cmdField.DeleteImageUrl = "~/images/delete.bmp";
            cmdField.EditImageUrl = "~/images/edit.bmp";
            cmdField.SelectImageUrl = "~/images/select.bmp";

            Columns.Insert(0, cmdField);
        }

        // this will show the grid even if there is no data
        int numRows = base.CreateChildControls(dataSource, dataBinding);

        //no data rows created, create empty table if enabled
        if (numRows == 0 && ShowWhenEmpty)
        {
            //create table
            Table table = new Table();
            table.ID = this.ID;

            //convert the exisiting columns into an array and initialize
            DataControlField[] fields = new DataControlField[this.Columns.Count];
            this.Columns.CopyTo(fields, 0);

            if (this.ShowHeader)
            {
                //create a new header row
                _headerRow2 = base.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);

                this.InitializeRow(_headerRow2, fields);
                table.Rows.Add(_headerRow2);
            }

            //create the empty row
            GridViewRow emptyRow = new GridViewRow(-1, -1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);

            TableCell cell = new TableCell();
            cell.ColumnSpan = this.Columns.Count;
            cell.Width = Unit.Percentage(100);
            if (!String.IsNullOrEmpty(EmptyDataText))
                cell.Controls.Add(new LiteralControl(EmptyDataText));

            if (this.EmptyDataTemplate != null)
                EmptyDataTemplate.InstantiateIn(cell);

            emptyRow.Cells.Add(cell);
            table.Rows.Add(emptyRow);

            if (this.ShowFooter)
            {
                //create footer row
                _footerRow2 = base.CreateRow(-1, -1, DataControlRowType.Footer, DataControlRowState.Normal);

                this.InitializeRow(_footerRow2, fields);
                table.Rows.Add(_footerRow2);
            }

            this.Controls.Clear();
            this.Controls.Add(table);
        }

        // I wanted one place to set alternating color for all instances of this control
        base.AlternatingRowStyle.BackColor = System.Drawing.Color.LightBlue;

        // now that the controls have been created, it's safe to reset these to their original values.  They'll be needed if you bind data later
        AutoGenerateDeleteButton = showDelete;
        AutoGenerateEditButton = showEdit;
        AutoGenerateSelectButton = showSelect;

        return numRows;
    }
1 голос
/ 19 июля 2010

Вы можете перейти с GridView.RowDataBound событием. Для этого используйте FindControl, чтобы настроить автогенерацию кнопки:

protected void yourGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton link = e.Row.Cells[0].Controls[0] as LinkButton;
        // do your stuff
    }
}
0 голосов
/ 12 октября 2018

Супер старый пост, но для тех, кто хочет чистый класс многократного использования для этого:

public class ImageGridview : GridView{
    protected override ICollection CreateColumns(PagedDataSource dataSource, bool useDataSource)
    {
        ArrayList fieldsArray = base.CreateColumns(dataSource, useDataSource);
        CommandField cf = (from o in fieldsArray
                           where o.GetType() == typeof(CommandField)
                           select (CommandField)o).FirstOrDefault();
        if (cf != null)
        {
            cf.ButtonType = ButtonType.Image;
            cf.DeleteImageUrl = "~/images/delete.png";
            cf.EditImageUrl = "~/images/edit.png";
            cf.SelectImageUrl = "~/images/select.png";
            cf.CancelImageUrl = "~/images/cancel.png";
            cf.UpdateImageUrl = "~/images/update.png";
        }
        return fieldsArray;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...