c# - 单击按钮阵列上的事件

标签 c# asp.net visual-studio-2008

如何获取最后一次在面板上单击的对象的名称?诀窍是面板上有一大堆按钮 (btn[1] ... btn [200])。如何检查我是否单击了按钮 b[180] 或 b[11] 甚至面板外(无按钮)?此外,按钮是在页面加载时通过编码生成的。 谢谢。安娜

编辑: 谢谢你!出现的另一个问题(这生成了 NULL 对象引用): 我有一个与 buttonHandler() 处于同一级别的方法,它被命名为 HowManyClicked(),它是从 buttonHandler() 中调用的。在 HowManyClicked() 内部,我想将 Button btn1 = Panel2.FindControl(x) 标识为 Button;例如,其中 x 是 buttonArray[2,3]。但我总是得到 NULL。 按钮数组 buttonArray 是否在生成它的方法中无法通过名称识别??

        public void buttonHandler(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //string tt = btn.ToolTip.ToString();
            btn.BackColor = Color.Red;
            statusL.Text = HowManyClicked().ToString();

        }

        public int HowManyClicked()
        {
            int sum=0;
            for (int a = 0; a < 10; a++)
                for (int b = 0; b < 14; b++)
                {
                    string x = "buttonArray[" + a + ", " + b + "]";
                    statusL.Text = x;
                    Button btn1 = Panel2.FindControl(x) as Button;
                    if (btn1.BackColor == Color.Red) sum += 1;

                }
            return sum;
        }

最佳答案

正如@AVD 所评论的那样,您可以获得发起回发的按钮并转换发送者对象,您还可以使用按钮对象中的 CommandNameCommandArgument 属性(它们是通常在按钮位于 GridDataList 等内部时使用,但如果需要,您可以在这种情况下使用它们):

    protected void Page_Init(object sender, EventArgs e)
    {
        var s = Enumerable.Range(1, 10);
        foreach (var item in s)
        {
            var b = new Button();
            b.Text = "My Button " + item.ToString();
            b.CommandName = "custom command";
            b.CommandArgument = item.ToString();
            b.Click += new EventHandler(b_Click);
            this.myPanel.Controls.Add(b);
        }
    }

    void b_Click(object sender, EventArgs e)
    {
        var current = sender as Button;
        this.lblMessage2.Text = "Clicked from array buttons: <br/>Command Name: " + current.CommandName + "<br/>Args: " + current.CommandArgument + "<br/>Button Unique ID: " + current.UniqueID + "<br/>Client ID: " + current.ClientID;
    }

页面:

<asp:Panel runat="server" ID="myPanel">
</asp:Panel>

<asp:Label ID="lblMessage2" runat="server" />

此代码生成如下内容:

enter image description here

作为附加说明,Microsoft 建议在 PreInit 事件中创建动态控件,或者如果您使用的是母版页,则在 Init 事件中

source

已编辑

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            this.ViewState["count"] = 0;
        }

    }


    protected void Page_Init(object sender, EventArgs e)
    {
        var s = Enumerable.Range(1, 10);
        foreach (var item in s)
        {
            var b = new Button();
            b.Text = "My Button " + item.ToString();
            b.Click += new EventHandler(buttonHandler);
            this.myPanel.Controls.Add(b);
        }
    }

    void buttonHandler(object sender, EventArgs e)
    {
        // update here your control
        var b = sender as Button;
        b.BackColor = Color.Red;
        HowManyClicked();
    }

    private void HowManyClicked()
    {
        var c = (int)this.ViewState["count"];
        c++;
        this.ViewState["count"] = c;
        this.lblMessage2.Text = "Clicked controls: " + this.ViewState["count"].ToString();
    }

这产生了:

enter image description here

关于c# - 单击按钮阵列上的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11061675/

相关文章:

asp.net - 将 Twitter 集成到 Asp.net

javascript - 只需单击一个按钮即可启用必填字段验证

asp.net - ASP.NET 的 Visual Studio 2008 性能分析器问题

c# - silverlight xaml 到 C#

c# - 使用 new() 或 default 初始化变量之间的区别?

c# - 发送后删除附件

c# - MSTest 超时属性未按预期工作

c# - Facebook 的大表实现

C# - 如果用户在插入记录后刷新页面,则会创建重复记录。我怎样才能防止这种情况发生?

asp.net - 将 Visual Studio 本地 IIS 7 调试虚拟路径设置为/