【问题标题】:How to assign methods to a dynamic created Gridview?如何将方法分配给动态创建的 Gridview?
【发布时间】:2021-05-30 03:56:28
【问题描述】:

我有以下类,它是用于创建 gridview 动态的类:

    public class DynamicGridViewImageButtonTemplate : ITemplate
    {
        string _ColName;
        DataControlRowType _rowType;
        int _Count;
        int _Kind;

        public DynamicGridViewImageButtonTemplate(string ColName, DataControlRowType RowType, int Kind)
        {
            _ColName = ColName;
            _rowType = RowType;
            _Kind = Kind;
        }

        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (_rowType)
            {
                case DataControlRowType.DataRow:
                    if (_Kind == 0)
                    {
                        Label lbl = new Label();
                        lbl.DataBinding += new EventHandler(this.lbl_DataBind);
                        container.Controls.Add(lbl);
                    }
                    else
                    if (_Kind == 1)
                    {
                        ImageButton vImageButton = new ImageButton();
                        vImageButton.ID = "btnGetVoucher";
                        vImageButton.CommandArgument = string.Format("<%# Eval({0}) %>", "Voucher");
                        vImageButton.CssClass = "divButton";
                        vImageButton.Height = 25;
                        vImageButton.Width = 25;
                        vImageButton.Command += new CommandEventHandler(btnGetVoucher_Command);
                        vImageButton.DataBinding += new EventHandler(this.imgBtn_DataBind);
                        container.Controls.Add(vImageButton);
                    }
                    break;
                default:
                    break;
            }
        }

以及以下用于将方法运行时分配给我在列中创建的图像按钮的 c# 代码:

        protected void btnGetVoucher_Command(object sender, CommandEventArgs e)
        {
            ImageButton btn = sender as ImageButton;
        }

        protected void gridview_RowCreated(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ImageButton vImageButton = (ImageButton)e.Row.FindControl("btnGetVoucher");
                vImageButton.Command += new CommandEventHandler(btnGetVoucher_Command);
            }
        }

gridcolumn的创建如下:

    GridView vGridView = new GridView();
    vGridView.RowCreated += new GridViewRowEventHandler(gridview_RowCreated);
    vTemplateField = new TemplateField();
    vTemplateField.HeaderTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.Header, 0);
    vTemplateField.ItemTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.DataRow, 1);
    vGridView.Columns.Add(vTemplateField);

最后是这里的数据绑定:

    private void imgBtn_DataBind(Object sender, EventArgs e)
    {
        ImageButton btn = (ImageButton)sender;
        GridViewRow row = (GridViewRow)btn.NamingContainer;
        btn.CommandArgument = DataBinder.Eval(row.DataItem, "Voucher").ToString();
    }

但我无法进入方法btnGetVoucher_Command :-( 我认为一切都已正确 - 但一定有什么地方我错过了......

我可以在我的 Row_Created 例程中访问该按钮 - 但之后不使用 GetVoucherCommand :-( 事件未触发 :-(

所以我的问题是为什么我不能进入那个例程?

提前致谢, 迈克尔

更新: 全班都在这里...

    public class DynamicGridViewTextTemplate : ITemplate
    {
        string _ColNameText;
        DataControlRowType _rowType;

        public DynamicGridViewTextTemplate(string ColNameText, DataControlRowType RowType)
        {
            _ColNameText = ColNameText;
            _rowType = RowType;
        }

        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (_rowType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = "<b>" + _ColNameText + "</b>";
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:
                    ImageButton vImageButton = new ImageButton();
                    vImageButton.ID = "btnGetVoucher";
                    vImageButton.ImageUrl = "~/Images/Icons/icons8-download-from-the-cloud-50.png";
                    vImageButton.PostBackUrl = "#DownloadVoucher";
                    vImageButton.CommandArgument = string.Format("<%# Eval({0}) %>", "Voucher");
                    vImageButton.ToolTip = "Se og download bilag";
                    vImageButton.CssClass = "divButton";
                    vImageButton.Height = 25;
                    vImageButton.Width = 25;
                    vImageButton.DataBinding += new EventHandler(this.imgBtn_DataBind);
                    vImageButton.CommandName = "DownloadVoucher";
                    vImageButton.Command += new CommandEventHandler(btnGetVoucher_Command);
                    container.Controls.Add(vImageButton);
                    break;
                default:
                    break;
            }
        }

        private void imgBtn_DataBind(Object sender, EventArgs e)
        {
            ImageButton btn = (ImageButton)sender;
            GridViewRow row = (GridViewRow)btn.NamingContainer;
            btn.CommandArgument = DataBinder.Eval(row.DataItem, _ColNameText).ToString();
        }

    }

    public class DynamicGridViewImageButtonTemplate : ITemplate
    {
        string _ColNameText;
        DataControlRowType _rowType;

        public DynamicGridViewImageButtonTemplate(string ColNameText, DataControlRowType RowType)
        {
            _ColNameText = ColNameText;
            _rowType = RowType;
        }

        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (_rowType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = "<b>" + _ColNameText + "</b>";
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:
                    ImageButton vImageButton = new ImageButton();
                    vImageButton.ID = "btnGetVoucher";
                    vImageButton.ImageUrl = "~/Images/Icons/icons8-download-from-the-cloud-50.png";
                    vImageButton.PostBackUrl = "#DownloadVoucher";
                    vImageButton.CommandArgument = string.Format("<%# Eval({0}) %>", "Voucher");
                    vImageButton.ToolTip = "Se og download bilag";
                    vImageButton.CssClass = "divButton";
                    vImageButton.Height = 25;
                    vImageButton.Width = 25;
                    vImageButton.DataBinding += new EventHandler(this.imgBtn_DataBind);
                    vImageButton.CommandName = "DownloadVoucher";
                    vImageButton.Command += new CommandEventHandler(btnGetVoucher_Command);
                    container.Controls.Add(vImageButton);
                    break;
                default:
                    break;
            }
        }

        protected void btnGetVoucher_Command(object sender, CommandEventArgs e)
        {
            ImageButton btn = sender as ImageButton;
        }

        private void imgBtn_DataBind(Object sender, EventArgs e)
        {
            ImageButton btn = (ImageButton)sender;
            GridViewRow row = (GridViewRow)btn.NamingContainer;
            btn.CommandArgument = DataBinder.Eval(row.DataItem, _ColNameText).ToString();
        }

    }

活动在这里...

protected void gridview_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ImageButton vImageButton = (ImageButton)e.Row.FindControl("btnGetVoucher");
    }
}

protected void gridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ImageButton vImageButton = (ImageButton)e.Row.FindControl("btnGetVoucher");
    }
}

protected void gridview_RowCommand(object sender, CommandEventArgs e)
{
    if (e.CommandName == "DownloadVoucher")
    {
        int index = Convert.ToInt32(e.CommandArgument);
        GridView grid = sender as GridView;
        GridViewRow row = grid.Rows[index];
        ImageButton vImageButton = (ImageButton)row.FindControl("btnGetVoucher");
    }
}

gridview的创建就到这里了……

GridView vGridView = new GridView();
vGridView.AutoGenerateColumns = false;
vGridView.ShowHeaderWhenEmpty = true;
vGridView.ShowHeader = true;
vGridView.HeaderStyle.BackColor = System.Drawing.ColorTranslator.FromHtml("#C6E0B4");
vGridView.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;

vGridView.RowCreated += new GridViewRowEventHandler(gridview_RowCreated);
vGridView.RowDataBound += new GridViewRowEventHandler(gridview_RowDataBound);
vGridView.RowCommand += new GridViewCommandEventHandler(gridview_RowCommand);

vTemplateField = new TemplateField();
vTemplateField.HeaderTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.Header);
vTemplateField.ItemTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.DataRow);
vGridView.Columns.Add(vTemplateField);

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    迈克尔。

    1. 在这段代码中,我在 InstantiateIn 方法中看不到事件处理代码。

    ex) 像这样。

    lbl.DataBinding += new EventHandler(this.btnGetVoucher_Command);
    
    1. DynamicGridViewTextTemplate 类构造函数参数为 3 个。

    但是,当使用 DynamicGridViewTextTemplate 构造函数时,

    只使用了 2 个计数参数。

    善良在哪里?

    试试看。

    vTemplateField.HeaderTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.Header, 0);
    vTemplateField.ItemTemplate = new DynamicGridViewImageButtonTemplate("Voucher", DataControlRowType.DataRow, 1);
    
    1. msdn 中的最佳示例

    https://docs.microsoft.com/ko-kr/dotnet/api/system.web.ui.webcontrols.templatefield.-ctor?view=netframework-4.8

    希望这个回答对你有帮助。

    【讨论】:

    • 感谢您的写作 :-) 是的 - 你是对的,我错过了 Kind 参数 - 但是如果我设置了这个参数,我仍然无法访问命令参数运行时:-( 你还有更多想法如何访问命令参数?
    • 我现在已经用 kind 参数更新了代码并添加了数据绑定例程...
    • 您是否应用了事件处理程序?未在您的代码中应用 btnGetVoucher_Command 处理程序。
    • 非常感谢您再次发表评论 :-) 我现在已经添加了这个事件处理程序 - 但仍然没有成功 :-(
    • 只使用种类 1?不处理实物0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多