Si los controles siempre están encuadernados a controles de origen de datos en el orden en que se declaran a continuación,

StackOverflow https://stackoverflow.com/questions/727274

Pregunta


A) pregunta a continuación se basa en la suposición de que los controles siempre están encuadernados a controles de origen de datos en el orden en que se declaran? Así, en nuestro ejemplo SqlDataSource1 se conectará a la fuente de datos antes de SqlDataSource2 y por lo tanto lstCities se rellenará con los valores antes de GridView1 , y la razón de ese ser que lstcities fue declarado antes de GridView1 ?


B) Si es así, entonces cuando hace exactamente ControlParameter recuperar un valor de DropDownList ? Asumo que es después de SqlDataSource1_Selected () controlador de eventos y antes de SqlDataSource2_Selecting () controlador de eventos, pero cuando precisamente?

En la página .aspx:

    <asp:SqlDataSource ID="SqlDataSource1" ... >
    </asp:SqlDataSource>

    <asp:DropDownList ID="lstCities" DataSourceID="SqlDataSource1"
         DataTextField="City" runat="server"></asp:DropDownList>

    <asp:SqlDataSource ID="SqlDataSource2" ... >
        <SelectParameters>
            <asp:ControlParameter ControlID="lstCities" Name="City"
                 PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>

    <asp:GridView DataSourceID="SqlDataSource2" runat="server" …>
    </asp:GridView>


Gracias

EDIT:

  

Si se trata de una devolución de datos, sin embargo, a continuación, los parámetros se cargan desde un estado de vista en la página de onLoadComplete, otra vez, en el orden en que se declaran.   

Q1 - Vamos a suponer ControlParameter está ligada a la propiedad de un C1 C. Control Me imagino que en las devoluciones de datos ControlProperty siempre sería capaz de obtener el valor de C.C1 de ViewState, no importa de qué tipo es C, e incluso si C ViewState tiene desactivado ?!

Q2 - Pero se puede saber por qué, si se crea una página por primera vez, no puede un valor para ControlParameter también puede recuperar de estado de vista? Después de todo, los lstCities momento recupera datos de fuente de datos, lstCities.SelectedValue ha establecido su valor?


Gracias compañero


SEGUNDA EDICIÓN:

Me disculpo por no haber respondido antes, pero no me había dado cuenta de que ha contestado. Y cuando lo hice, he pasado buena 20 minutos tratando de conseguir mis 3 braincells para que funcione correctamente, pero no estoy seguro si lo lograba bastante


A) Entonces ControlParameter evalúa C.C1 y así recupera el valor de C.C1 después de C ha sido atado?!


  

Q1 - ControlParameter sólo lee su propio estado y sólo para determinar si ha cambiado

A) cheques Así ControlParameter si su ViewState ha cambiado (con el fin de desencadenar el evento OnParameterChanged) antes de la unión tiene lugar -> por lo que comprueba su ViewState durante Page.OnLoadComplete. Pero, ¿cómo va a saber que su ControlParameter ViewState ha cambiado (se conocerá en primera devolución de datos)? Después de todo, desde la primera vez que la página se crea ViewState de ControlParameter siempre será marcado como sucio, así que ¿cómo será, de una devolución de datos a otro, ControlParameter saber si su valor ha cambiado entre las devoluciones de datos?

B) Asumo cheques ControlParameter si su Viewstate cambiarse sólo por lo que puede desencadenar el evento OnParameterChanged. Pero ¿por qué es la manipulación de ese evento tan importante?


  

La primera vez que una evaluación de la propiedad sucede está en Page.OnLoadComplete

Por la evaluación de propiedades usted se refiere a ControlParameter comprobar su propia ViewState? Así que no quieres decir ControlParameter evaluar C.C1 (que supongo que sucede después de C ha sido atado)


Realmente aprecio su ayuda


TERCERA EDICIÓN:

Lo siento mucho por volver a aprovechar su time.I va a hacer todo lo posible para que esta última edición.


Update () es llamado tanto en onLoadComplete y cuando el enlace de datos se lleva a cabo. Dentro de actualización () también se ejecuta la siguiente frase:

this.ViewState["ParameterValue"] = actualValue;

Así que si Update () es llamado cuando el enlace de datos se lleva a cabo, a continuación, lo que significa que se  que cuando en la siguiente actualización de devolución de datos () es llamado en onLoadComplete, C.C1 y ControlParameter ya tendrá mismos valores y, por tanto

             if ((actualValue == null && storedValue != null)
             || (actualValue != null && actualValue != storedValue))

siempre devuelve falso (cuando Update () es llamado en onLoadComplete), y el evento de manera OnParameterChanged nunca va a ser despedido? 1 Si es así, el no veo la necesidad de llamar a Update () en onLoadComplete!


muy agradecido

¿Fue útil?

Solución

Su primera suposición es correcta.

Para su segunda pregunta, depende de si se trata de una devolución o no, y / o si va a enlazar de forma explícita. Si no es así el segundo palo y la unión se realiza automáticamente a continuación, en términos generales, el valor de la ControlParameter se recupera cuando DataSourceView llama Select en DataBind, justo antes del evento OnSelecting. La secuencia para el gridview (y cualquier control dado para esa materia) es el siguiente:

Page.ProcessRequest
Page.PreRenderRecursiveInternal
...
GridView.EnsureChildControls
GridView.CreateChildControls
GridView.DataBind
GridView.PerformSelect
DataSourceView.Select //comes from either SQLDataSource or LinqDataSource
DataSourceView.ExecuteSelect
//for Linq:
    LinqDataSourceView.GetParameterValues(WhereParameters)
//for SQL:
    SqlDataSourceView.InitializeParameters(SelectParameters)
Parameters.GetValues
Parameters.UpdateValues //this is where values get retrieved using reflection
DataSourceView.OnSelecting //follows almost immediately
...get data...
DataSourceView.OnSelected

Por lo tanto, para cada control en una jerarquía de control, el marco de trabajo llama de forma recursiva DataBind, lo cual dispara la recuperación de parámetros, OnSelecting, la recuperación de datos, y OnSelected.

Si se trata de una devolución de datos, sin embargo, a continuación, los parámetros se cargan desde un estado de vista en la página de onLoadComplete, otra vez, en el orden en que se declaran.

Es esto lo que estabas buscando?

Editar

  

Q1 - Vamos a suponer ControlParameter está ligada a la propiedad de un C1 C. Control Me imagino que en las devoluciones de datos ControlProperty siempre sería capaz de obtener el valor de C.C1 de ViewState, no importa de qué tipo es C, e incluso si C ha deshabilitado ViewState?!

Eso no es del todo cómo sucede ... En segundo palo (y en la solicitud inicial para el caso), el estado de vista de ControlParemeter sólo se evalúa para ver si se ha cambiado para que el evento OnParameterChanged podría ser despedido. El valor real de la ControlParameter se evalúa contra el control al que apunta (a través de la reflexión). En su caso sería "C.C1". Ahora, cuando se lee C.C1, su valor es más probable que lee de un estado de vista. Pero en ningún momento la ControlParameter leer el estado de vista de C directamente.

  

Q2 - Pero se puede saber por qué, si se crea una página por primera vez, no puede un valor para ControlParameter también puede recuperar de estado de vista? Después de todo, los lstCities momento recupera datos de fuente de datos, lstCities.SelectedValue ha establecido su valor?

Eso es lo que, en ese momento (la primera página se carga el tiempo) los lstCities no recuperó de datos. La primera vez que una evaluación de la propiedad sucede está en Page.OnLoadComplete, pero antes de cualquier DataBind (lo que ocurre poco después, cuando Page.PreRenderRecursiveInternal es despedido).

En la forma cruda, tratando de colocarlo en un ciclo de vida de una página:

...request...
PerformPreInit
InitRecursive //SqlDataSource subscribes to Page.LoadComplete
OnInitComplete
if PostBack
    LoadAllState //the view state gets loaded
    ProcessPostData
OnPreLoad
LoadRecursive
if PostBack
    ProcessPostData
    RaiseChangedEvents
    RaisePostBackEvents //you handle your events
//notice that following sections assume that you did not do any data 
//binding inside your events
OnLoadComplete //This is where parameters (SelectParemeters/WhereParemeters)
    //get updated. At this point none of them are data bound yet.
    //And if it the first time, there are no values
    //as the ViewState is empty for them.
PreRenderRecursiveInternal //calls the DataBind (if you haven't already), 
    //then DataSourceView.Select; parameters evaluate their controls.
    //The control C would be bound at this point.
PerformPreRenderComplete
SaveAllState
OnSaveStateComplete
RenderControl

Segunda Edición

  

Así ControlParameter evalúa C.C1 y así recupera el valor de C.C1 después de C ha sido atado?!

El ControlParameter recupera los valores cada vez que se le pide, lo que sucede en este escenario (indirectamente) en dos lugares: onLoadComplete y DataBind (provocada por PreRenderRecursiveInternal). En onLoadComplete, el C no está presa. En PreRenderRecursiveInternal, después de DataBind, la C es unido. En ambas ocasiones ControlParameter pide que lea C.C1. Tal vez siguiente le ayudará ...

Aquí están las clases y los métodos de interés en una cáscara de nuez. Colocarlos en perspectiva del ciclo de página y espero que sea claro.

public class ControlParameter : Parameter
{
    public string ControlID { get; set; } //stored in ViewState
    public string PropertyName { get; set; } //stored in ViewState

    protected override object Evaluate(HttpContext context, Control owner)
    {
        Control sourceControl = DataBoundControlHelper.FindControl(owner, this.ControlID);
        //evaluate C.C1 using reflection
        return DataBinder.Eval(sourceControl, this.PropertyName);
    }

    internal void UpdateValue(HttpContext context, Control owner)
    {
        //PostBack or not, read stored value (on initial load it is empty)
        object storedValue = this.ViewState["ParameterValue"];
        //Get the actual value for this parameter from C.C1
        object actualValue = this.Evaluate(context, owner);
        //Store received value
        this.ViewState["ParameterValue"] = actualValue;
        //Fire a change event if necessary
        if ((actualValue == null && storedValue != null)
         || (actualValue != null && actualValue != storedValue))
            this.OnParameterChanged();
    }
}

public class SqlDataSource : DataSourceControl
{
    //fired by OnLoadComplete
    private void LoadCompleteEventHandler(object sender, EventArgs e)
    {
        //UpdateValues simply calls the UpdateValue for each parameter
        this.SelectParameters.UpdateValues(this.Context, this);
        this.FilterParameters.UpdateValues(this.Context, this);
    }
}

public class SqlDataSourceView : DataSourceView, IStateManager
{
    private SqlDataSource _owner;

    //this method gets called by DataBind (including on PreRenderRecursiveInternal)
    protected internal override IEnumerable ExecuteSelect(DataSourceSelectArguments arguments)
    {
        DbConnection connection = this._owner.CreateConnection(this._owner.ConnectionString);
        DbCommand command = this._owner.CreateCommand(this.SelectCommand, connection);
        //This is where ControlParameter will read C.C1 values again.
        //Except this time, C.C1 will be already populated by its own DataBind
        this.InitializeParameters(command, this.SelectParameters, null);

        command.CommandType = GetCommandType(this.SelectCommandType);
        SqlDataSourceSelectingEventArgs e = new SqlDataSourceSelectingEventArgs(command, arguments);

        this.OnSelecting(e);

        if (e.Cancel)
            return null;

        //...get data from DB

        this.OnSelected(new SqlDataSourceStatusEventArgs(command, affectedRows, null));

        //return data (IEnumerable or DataView)
    }

    private void InitializeParameters(DbCommand command, ParameterCollection parameters, IDictionary exclusionList)
    {
        //build exlusions list
        //...
        //Retrieve parameter values (i.e. from C.C1 for the ControlParameter)
        IOrderedDictionary values = parameters.GetValues(this._context, this._owner);

        //build command's Parameters collection using commandParameters and retrieved values
        //...
    }
}
  

A) cheques Así ControlParameter si su ViewState cambiado ...

Consulte el método UpdateValue arriba para ver cómo se utiliza ViewState.

  
    

B) Asumo cheques ControlParameter si su Viewstate cambiarse sólo por lo que puede desencadenar el evento OnParameterChanged. Pero ¿por qué es la manipulación de ese evento tan importante?

  

No sé que es importante. Supongo que, como cualquier otro evento, que permite realizar un seguimiento de los cambios en las propiedades de los parámetros y actuar de acuerdo a sus necesidades. Que es despedido en muchos lugares, pero no veo donde cualquier persona se adhiere a ella. Así que ...

  

Por la evaluación de propiedades usted se refiere a ControlParameter comprobar su propia ViewState? Así que no quieres decir ControlParameter evaluar C.C1 (que supongo que sucede después de C tiene been obligado)

Esto significa que el ControlParameter.UpdateValue se llama, que comprueba ViewState por las razones expuestas, a continuación, llama ControlParameter.Evalue, que luego se encuentra un control y recupera los datos utilizando la reflexión (Eval). Ver más arriba.

Tercera Edición

supongo que por actualización que quiere decir UpdateValue.

  

Así que si Update () es llamado cuando el enlace de datos se lleva a cabo, a continuación, lo que esto significa es que cuando en la próxima actualización de devolución de datos () se llama en onLoadComplete, C.C1 y ControlParameter ya tendrán mismos valores ...

No es necesario. Están olvidando que el estado de vista se carga en LoadAllState y entre éste y el onLoadComplete hay seis pasos más (véase la página anterior ciclo de vida). Cada uno de los puede modificar el valor del control de origen (C.C1).

Supongamos que tiene C.C1 = "x" e hizo un segundo palo. Ahora, el estado de vista para todos los controles se carga (LoadAllState). Si C.C1 almacena su valor en el estado de vista, se carga "x". En Load (LoadRecursive) decide establecer C.C1 = "y". Aquí C.C1 puede decidir almacenar "y" en su estado de vista o no - es irrelevante. Luego siguen otros eventos. A continuación viene onLoadComplete. Desde SqlDataSource se suscribe a este evento, que evaluará todos los parámetros asociados (LoadCompleteEventHandler) y, ya que la ha cambiado C.C1 pero el estado de vista de ControlParameter no lo hicieran, el

if ((actualValue == null && storedValue != null)
 || (actualValue != null && actualValue != storedValue))
    this.OnParameterChanged();

devolverá verdadero y OnParameterChanged será despedido. Por cierto, hay por lo menos otros diez lugares en los que este evento se dispara. No juega papel importante (si lo hay) en los datos de proceso de recuperación de propiedad de enlace y.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top