лучший способ создания динамических кнопок в asp .net / c #, которые могут получить доступ к динамическим текстовым полям и запомнить их прежние значения? - PullRequest
0 голосов
/ 11 января 2012

Вот в чем дело, теперь у меня есть рабочий прототип того, что я хочу, и кажется, что он отлично работает для того, что я хочу сделать.С учетом сказанного, это НЕ МОЖЕТ быть лучшим способом сделать это.И под лучшим я подразумеваю как простоту программы, так и то, КАК я на самом деле ее кодировал.В любом случае сначала следует описание того, что должна делать страница:

1) страница содержит текстовое поле (Textbox1), заполнитель (Placeholder1) и кнопку (Button1)

код для этогопросто:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

<hr />
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
<hr />

2) пользователь может ввести число в текстовое поле (скажем, 99) и нажать кнопку.тогда заполнитель будет заполнен 99 текстовыми полями с кнопкой «Сохранить» рядом с каждым. 3) Пользователь может редактировать любое текстовое поле и нажимать кнопку «Сохранить» рядом с ним, и функция, которая затем вызывается событием нажатия кнопки, должна иметь возможностьиметь доступ к A) текущему значению текстовых полей, B) старому значению текстовых полей, C) любому количеству метаданных

вот мое текущее рабочее решение:

    protected void Page_Load(object sender, EventArgs e)
    {
        createStuff(false);

    }

    void test(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        Response.Write(btn.ID + "Clicked" + "<br />");
        Response.Write("Metadata: " + Session[btn.ID + "a"] + "<br />");
        Response.Write("Old text: " + Session[btn.ID + "b"] + "<br />");

        TextBox txtBlah = (TextBox)PlaceHolder1.FindControl("txt"+btn.ID);
        Response.Write("New text: " + txtBlah.Text + "<br />");

        Session[btn.ID + "b"] = txtBlah.Text;

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Session["num"] = TextBox1.Text;
        createStuff(true);
    }

    private void createStuff(bool btnClick)
    {
        PlaceHolder1.Controls.Clear();

        int numBtn = Convert.ToInt32(Session["num"]);

        for (int i = 0; i < numBtn; i++)
        {
            TextBox txtTemp = new TextBox();
            txtTemp.Text = "old" + i;
            txtTemp.ID = "txt" + "btn" + i;
            PlaceHolder1.Controls.Add(txtTemp);

            Button btn = new Button();
            btn.Text = "btn" + i;
            btn.ID = "btn" + i;
            btn.Click += new EventHandler(test);
            PlaceHolder1.Controls.Add(btn);

            Session[btn.ID + "a"] = "meta" + i;

            if (btnClick)
            {
            Session[btn.ID + "b"] = txtTemp.Text;
            }

            PlaceHolder1.Controls.Add(new LiteralControl("<br />"));
        }


    }

Я думаю, что этона самом деле довольно приличный, и я очень доволен этим.Но я знаю, что должны быть некоторые улучшения, которые я могу сделать, так как некоторые из руководств о том, как система обратной передачи ASP и объектная модель или как ее там называют, даже сейчас приводят меня в замешательство.

любая помощь или даже просто идеиполезны спасибо.

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Единственное существенное улучшение, которое я вижу, это: используйте UserControl , поместите TextBox и Button внутрь, добавьте свойства (такие как OldValue / NewValue, сохраненные в ViewState / TextBox) и добавьте эти UserControls к PlaceHolder после того, как вы создали экземпляры, используя LoadControl .

«Метаданные» также должны храниться как свойство в UserControl. Вы должны использовать События для связи между UserControl и Page (например, TextSaved).

Вы можете сохранить количество созданных элементов управления в ViewState вместо Session. Это единственное, что вам нужно хранить на странице. Добавьте индекс UserControl к его идентификатору.


Общие преимущества веб-управления пользователем:

Самым большим преимуществом элементов управления веб-пользователя является то, что они могут быть созданы в качестве шаблона сайта и использоваться во всем сайте. Например, они могут содержать структуру меню / ссылок сайта и могут использоваться на всех других страницах aspx.

Это означает следующее:

  • Если веб-сайт вводит новую общесайтовую ссылку в текущем макете / структуре, достаточно, если мы поместим ее в пользовательский элемент управления один раз. Все страницы будут обновляться один раз, если в них используется веб-элемент управления.
  • Если есть какая-либо ссылка, которую нужно исправить, это можно сделать один раз на стороне сервера.
  • Файлы .ascx могут использоваться в качестве простой альтернативы простому HTML или реагировать на события: это означает, что даже собственный код может быть создан для них и помещен в код за файлами .

  • http://www.dotnet -guide.com / usercontrol5.html

UserControls инкапсулирует сложность, которую всегда полезно увеличивать

... и уменьшить вероятность ошибок

Прочитайте этот SO-ответ для большего количества примеров.

0 голосов
/ 13 января 2012

хорошо, я не знаю, если это правильное место для меня, чтобы опубликовать мой новый код, но я думаю, это будет считаться "ответом".Также я хочу сказать большое спасибо за ваши ответы, они были невероятно полезны.немного загадочно, но пятьдесят страниц учебников или около того позже, и да, ваши рекомендации были фантастическими, так что спасибо и браво.В любом случае, вот мой самый новый, который отлично сочетается с тем, что я считаю вашими рекомендуемыми дополнениями.если вы хотите взять пик и посмотреть, будете ли вы делать что-то немного другое или, может быть, проще, пожалуйста, дайте мне знать

сначала мой пользовательский элемент управления "MyControl"

ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" Inherits="DBtest.MyControl" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<br />

ascx.cs:

    //private String _oldText;
    private String _metaData;

    public String OldText
    {
        get
        {
            //return _oldText;
            return (String)ViewState["OldText"];
        }
        set
        {
            //_oldText = value;
            ViewState["OldText"] = value;
        }
    }

    public String MetaData
    {
        get
        {
            return _metaData;
        }
        set
        {
            _metaData = value;
        }
    }

    public String NewText
    {
        get
        {
            return TextBox1.Text;
        }
        set
        {
            TextBox1.Text = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Write("My ID: " + this.ID + "<br />");
        Response.Write("My Metadata: " + _metaData + "<br />");
        Response.Write("My Old Text: " + ViewState["OldText"] + "<br />");
        Response.Write("My New Text: " + TextBox1.Text + "<br />");

        ViewState["OldText"] = TextBox1.Text;
    }

тогда моя страница, aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="TESTdynamicButton3.aspx.cs" Inherits="DBtest.TESTdynamicButton3" %>
<%@ Register TagPrefix="uc" TagName="Spinner" Src="MyControl.ascx" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

    <hr />
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
    <hr />

</asp:Content>

aspx.cs:

    protected void Page_Load(object sender, EventArgs e)
    {
        createStuff(false);
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        ViewState["num"] = TextBox1.Text;
        createStuff(true);
    }

    private void createStuff(bool btnClick)
    {
        PlaceHolder1.Controls.Clear();
        int numBtn = Convert.ToInt32(ViewState["num"]);

        for (int i = 0; i < numBtn; i++)
        {
            MyControl temp2 = LoadControl("MyControl.ascx") as MyControl;
            temp2.ID = "uc" + i;
            temp2.MetaData = "meta" + i;
            //not sure why this DOES work, i would think it is overwritten each page load >.<
            temp2.OldText = "old" + i;

            if (btnClick)
            {
                temp2.NewText = "old" + i;
                //not sure why this doesnt work below this line
                //temp2.OldText = "old" + i;
            }

            //also not sure why this won't work
            //temp2.OldText = temp2.NewText;

            PlaceHolder1.Controls.Add(temp2);
        }
    }

и у меня также есть пара содержимого, где я не уверен, что вполне логично, почему или делают, или не используют эти строки, чтобы исходное состояние «старого текста» заполнялось должным образом.я бы подумал, что мне нужно проверить эту кнопку и только установить состояние просмотра в первый раз, чтобы заставить его работать.также я не уверен, что понимаю, почему, когда я пытался переместить функцию createStuff () в OnInit или переопределить функции pre init, это не сработало бы.

спасибо!

Лев

...