/ / Cómo obtener un valor modificado del control dinámico después de la devolución C # - c #, dynamic, controles, viewstate, placeholder

Cómo obtener un valor cambiado de control dinámico después de la devolución C # - c #, dynamic, controles, viewstate, placeholder

Recientemente he creado un control que creará uncontrol dinámico en un marcador de posición así que para conservar este control, lo almacené en viewstate y luego en la devolución lo volví a crear. En realidad está funcionando, pero ¿cómo puedo guardar el nuevo valor modificado de este control porque después de la devolución de datos me está dando el mismo valor?

La propiedad para mantener en estado de vista el control.

    public Control MyControl
{
get
{
return (Control)ViewState["MyControl"] ?? null;
}
set
{
this.ViewState["MyControl"] = value;
}
}

Luego, un método que creará el control cuando haga clic en el botón Editar para cambiar de Literal a un Cuadro de texto.

    private void CreateControl()
{
Control ctrl = new TextBox();
this.MyControl = ctrl;
this.BindValue(ctrl); //Bind the value from DB Text = "1"
this.placeHolder.Controls.Add(ctrl);
}

Luego el control aparecerá con el valor de "1" y luego cambié a "2", luego haga clic en un botón para guardar los cambios.

    protected void btnSave_Click(object sender, ImageClickEventArgs e)
{
string value = String.Empty;
Control ctrl = this.MyControl;
if (ctrl is TextBox)
{
//I want here the value of 2 but I get 1 again
value = ((TextBox)ctrl).Text;
}
//Save operation into DB
}

----- EDITAR -----

Lo único que necesitaba era recrear los objetos en el evento de carga como Dmytro Rudenko dijo antes. Más de init o no que solucionó mi problema. Ya no necesito el estado visual

    protected override void OnLoad(EventArgs e)
{
Control ctrl = this.CreateControl();
this.placeHolder.Controls.Add(ctrl);
}

Respuestas

1 para la respuesta № 1

Debes crear tu control dinámico en Page_Init método en cada postback. En este caso, el control creado puede restaurar su estado de vista con éxito.

  1. Añadir campo oculto al formulario:

    <input type="hidden" name="recreate" value="<%= ViewBag["recreate"] %>" />
    
  2. agregar control

    private void CreateControl()
    {
    Control ctrl = new TextBox();
    this.DynamicControl = ctrl;
    this.BindValue(ctrl); //Bind the value from DB Text = "1"
    this.placeHolder.Controls.Add(ctrl);
    ViewBag["recreate"] = "1";
    }
    
  3. Recrear el control

    protected Page_Init(object sender, EventArgs e)
    {
    if (Request.Form["recreate"] != null && Request.Form["recreate"] == "1")
    {
    CreateControl();
    }
    }
    

0 para la respuesta № 2

El valor no se está guardando en el ViewState. Cada vez que se hace clic en el botón btnSave, la página vuelve a agregar el control a la página, ANTES, se activa el evento del botón Guardar. Por lo tanto, su método CreateControl () se dispara antes del evento btnSave, y el valor "1" se está recargando en el control recién creado. En su método, deberá diferenciar cuándo desea que ese valor esté vinculado al control, ya sea con! IsPostback o por algún otro medio que sea necesario para su aplicación.

He usado una variable que describe lo que estaba causandola devolución de dinero Si la devolución se basó en un clic en el menú, la página vuelve a agregar todos los controles y luego vincula los controles apropiados a la base de datos. Si la devolución de datos fue causada por un menú desplegable o una página de vista de cuadrícula, la página vuelve a agregar los controles, pero no los vincula a la base de datos, a fin de conservar sus valores de entrada. Pero, hay diferentes maneras de hacer esto y, nuevamente, depende de las necesidades de su aplicación.