Clickable Webcontrol, ASP.NET

浪尽此生 提交于 2019-12-13 15:22:35

问题


This is question is in relation to my last question in case you want some more background information.

My question is: Is it possible to make a cell in an asp.net Table clickable?

Or Is it at least possible to make a clickable WebControl (which should be possible to place in a ControlCollection), that is not a Button or a LinkButton, in ASP.NET? And if not, is it possible to multiple lines of information into the button text?

I've tried adding other components to the button's ControlCollection (which I've seen working in the Windows Forms version of the Button), to see if I could render child components to a button, but without success:

private void ModifyTableCell(TableCell cell)
{
    //Create new button
    Button btnCell = new Button();
    btnCell.Click += (sender, args) =>
    {
        //Event for the button
    };

    //Create new Label
    Label lblCell = new Label();
    lblCell.Font.Bold = true;
    lblCell.Text = "This text won't appear";

    btnCell.Controls.Add(lblCell); //Attempt to add label to Button
    cell.Controls.Add(btnCell);
}

EDIT: I ended up just creating a multi-lined LinkButton for the entire cell.


回答1:


You should be able to make pretty much any control clickable by assigning an onclick attribute and leveraging the __doPostBack function.

ctrl.Attributes["onclick"] = string.Format("__doPostBack('{0}', '{1}');", ctrl.ClientID, "SomeArgument");

You could also use the GetPostBackEventReference method too. This option is actually safer, because it will register the __doPostBack function it doesn't already exist:

ctrl.Attributes["onclick"] = Page.ClientScript.GetPostBackEventReference(ctrl, string.Empty);

Then, in the code-behind you can simply override the RaisePostBackEvent method:

protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
    base.RaisePostBackEvent(source, eventArgument);

    if (eventArgument == "SomeArgument") //using the argument
    {
        //do whatever
    }
}



回答2:


You can add multiple lines to a asp.net button by using the string builder, something like:

System.Text.StringBuilder buttonText = new System.Text.StringBuilder();
buttonText.AppendLine("first line");
buttonText.AppendLine("second line");
btnMultiline.Text = buttonText.ToString;



回答3:


I am not sure how you imagine such a composite control would be rendered. Remember that each ASP.NET control in the end outputs HTML. You Button essentially outputs a

<input type="button">The button text</input>

If you want to place anything else inside the <input> tag, it must be HTML-compatible. I'm not sure the input tag allows other HTML inside.

If it is a LinkButton on the other hand, the generated HTML markup is an <a href=""> tag. You can put anything there, even an image if you wish, which will become clickable.

I am not sure what is your full scenario, but what you're trying to do smells bad. I suggest that you either use a LinkButton or rethink your approach, just have in mind what the final output in HTML would be.




回答4:


In reading both of your posts, it looks like you want to be able to click on anything in the cell and have it post back as if the whole cell were a button?

If so, one of the fairly simple ways to do it is to build your cell content as you would if you were not trying to post back. Then add a button with a style of display:none;. You can then use client side scripting to capture the click event of the cell, and raise the click event of the button to cause a post back.

This allows you to create the cell content in any way you like, and the postback code and handlers are automatically generated for you.

Using JQuery you end up with something along the lines of this:

<head runat="server">
    <style>
        input.ClickableCellButton
        {
            display: none;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("td.ClickableCell").click(function (event) { $(event.target).children("input.ClickableCellButton").click() });
        });
    </script>
    <div>
        <table>
            <tbody>
                <tr>
                    <td class="ClickableCell">
                        Cell Contents<br />
                        on multiple lines
                        <asp:Button ID="Button1" runat="server" Text="Button" CssClass="ClickableCellButton"
                            OnClick="Button1_Click" />
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    </form>
</body>



回答5:


And if not, is it possible to multiple lines of information into the button text?

For this particular case, you can accomplish this via CSS only; no need to extend Button:

<asp:button id="myMultilineButton" runat="server" style="width:60px; white-space: normal;" Text="Several lines of text" />

It will render as:



来源:https://stackoverflow.com/questions/10500019/clickable-webcontrol-asp-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!