Не удалось загрузить viewstate с помощью составного элемента управления - PullRequest
0 голосов
/ 18 октября 2010

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

Я переопределил методы LoadViewState и SaveViewState, как рекомендовано многими публикациями в Интернете, но я все еще получаю сообщение об ошибке «Не удалось загрузить ViewState». Элемент управления будет отображаться соответствующим образом при первой загрузке, но после выполнения любой обратной передачи он генерирует ошибку «Не удалось загрузить ViewState».

Вот часть кода для составного элемента управления:

    [Serializable]
internal enum SearchPanelControlType
{
    Label,
    DropDownList,
    TextBox
}
[Serializable]
internal class SearchGridViewStateObject<T> where T : Bll.BaseCriteria
{
    public T mySearchCriteria { get; set; }
    public SearchGridType myType { get; set; }
    public int myNumberOfChildrenPerRow { get; set; }
    public object myBaseViewState { get; set; }

    public SearchGridViewStateObject(T searchCriteria, SearchGridType type, int numberOfChildrenPerRow, object baseViewState)
    {
        mySearchCriteria = searchCriteria;
        myType = type;
        myNumberOfChildrenPerRow = numberOfChildrenPerRow;
        myBaseViewState = baseViewState;
    }
}
[Themeable(true)]
[Serializable]
public class SearchGrid<T> : CompositeControl
     where T : Bll.BaseCriteria
{
    #region Constructor
    public SearchGrid()
    {
    }
    #endregion

    #region Private Fields
    private MyCompanygridview myGridView;
    private ObjectDataSource myObjectDataSource;
    private Panel mySearchParametersPanel;
    private Button mySearchButton;
    private Button myClearSearchCriteriaButton;
    private T mySearchCriteria;
    //private SearchGridType myType = SearchGridType.Account;
    private SearchGridType myType;
    private int myNumberOfChildrenPerRow = 2;
    private MyCompanygridviewSelectionType mySelectionType = MyCompanygridviewSelectionType.None;
    private int mySelectColumnIndex = 0;
    private int myPageSize = 10;
    private int myPageIndex = 0;
    private string myGridViewCssClass;
    private string myCustomPagerButtonCssClass;
    private string myCustomPagerTextBoxCssClass;
    private string myRowCssClass;
    private string myEmptyDataRowCssClass;
    private string myPagerCssClass;
    private string mySelectedRowCssClass;
    private string myHeaderCssClass;
    private string myAlternatingRowCssClass;
    private string myDisabledRowCssClass;
    private List<Guid> myGridViewDisabledValues = new List<Guid>();
    private List<Guid> myGridViewSelectedValues = new List<Guid>();
    private GridLines myGridLines = GridLines.None;
    private string mySearchPanelButtonCssClass;
    private string mySearchPanelTextBoxCssClass;
    private string mySearchPanelDropDownListCssClass;
    private string mySearchPanelLabelCssClass;



    #endregion

    #region Public Properties
    /// <summary>
    /// Gets or sets the search criteria.
    /// </summary>
    /// <value>The search criteria.</value>
    public T SearchCriteria
    {
        get
        {
            return mySearchCriteria;
        }
        set
        {
            if (value != mySearchCriteria)
            {
                mySearchCriteria = value;
                this.ChildControlsCreated = false;
                this.EnsureChildControls();
            }
        }
    }
    /// <summary>
    /// Gets or sets the type of items that should be shown in the gridview.
    /// </summary>
    /// <summary>
    /// Gets or sets the type of items that should be shown in the gridview.
    /// </summary>
    [Category("SearchGrid"),
    Description("Gets or sets the type of items that should be shown in the grid view."),
    DefaultValue(null)]
    public SearchGridType Type
    {
        get
        {
            return myType;
        }
        set
        {
            if (value != myType)
            {
                myType = value;
                this.ChildControlsCreated = false;
                this.EnsureChildControls();
            }
        }

    }
    [DefaultValue(MyCompanygridviewSelectionType.None),
    Category("SearchGrid"),
    Description("Indicates whether to use multiselection mode, single selection mode, or no selection mode.")]
    public MyCompanygridviewSelectionType SelectionType
    {
        get
        {
            return mySelectionType;
        }
        set
        {
            mySelectionType = value;
        }
    }
    #endregion
    #region Overridden Methods
    protected override void LoadViewState(object savedState)
    {
        SearchGridViewStateObject<T> vsObject = savedState as SearchGridViewStateObject<T>;
        mySearchCriteria = vsObject.mySearchCriteria;
        myType = vsObject.myType;
        myNumberOfChildrenPerRow = vsObject.myNumberOfChildrenPerRow;

        ClearChildViewState();
        this.ChildControlsCreated = false;
        this.EnsureChildControls();

        base.LoadViewState(vsObject.myBaseViewState);
    }
    protected override object SaveViewState()
    {
        SearchGridViewStateObject<T> vsObject = new SearchGridViewStateObject<T>(mySearchCriteria, myType, myNumberOfChildrenPerRow, base.SaveViewState());
        return vsObject;
    }
    protected override void RecreateChildControls()
    {
        EnsureChildControls();
    }
    protected override void CreateChildControls()
    {
        SearchGridParser parser = SearchGridParserFactory.GetParser(this.myType);

        Controls.Clear();

        //Define the Search Parameters Panel
        mySearchParametersPanel = new Panel();
        mySearchParametersPanel.ID = "spp" + Enum.GetName(typeof(SearchGridType), this.myType);
        mySearchParametersPanel.DefaultButton = "btnSearch";
        mySearchParametersPanel.ScrollBars = ScrollBars.None;
        parser.CreateSearchPanelControls(ref mySearchParametersPanel, CreateSearchPanelStyleDictionary());


        //Define Buttons
        mySearchButton = new Button();
        mySearchButton.ID = "btnSearch";
        mySearchButton.Text = "Search";
        mySearchButton.CausesValidation = false;
        mySearchButton.UseSubmitBehavior = false;
        mySearchButton.Click += new EventHandler(mySearchButton_Click);
        if (!string.IsNullOrEmpty(mySearchPanelButtonCssClass))
        {
            mySearchButton.CssClass = mySearchPanelButtonCssClass;
        }

        myClearSearchCriteriaButton = new Button();
        myClearSearchCriteriaButton.ID = "btnClearSearchCriteria";
        myClearSearchCriteriaButton.Text = "Clear Search Criteria";
        myClearSearchCriteriaButton.CausesValidation = false;
        myClearSearchCriteriaButton.UseSubmitBehavior = false;
        myClearSearchCriteriaButton.Click += new EventHandler(myClearSearchCriteriaButton_Click);
        if (!string.IsNullOrEmpty(mySearchPanelButtonCssClass))
        {
            myClearSearchCriteriaButton.CssClass = mySearchPanelButtonCssClass;
        }

        mySearchParametersPanel.Controls.Add(mySearchButton);
        mySearchParametersPanel.Controls.Add(myClearSearchCriteriaButton);

        // Define the GridView
        myGridView = new MyCompanygridview();
        myGridView.ID = "gv" + Enum.GetName(typeof(SearchGridType), this.myType);
        myGridView.AutoGenerateColumns = false;
        myGridView.DataKeyNames = new string[] { "ID" };
        myGridView.DataSourceID = "ods" + Enum.GetName(typeof(SearchGridType), this.myType);
        myGridView.AllowSorting = true;
        myGridView.Width = new System.Web.UI.WebControls.Unit("100%");
        myGridView.AllowPaging = true;
        myGridView.EnableCustomPager = true;
        myGridView.Sorted += new EventHandler(myGridView_Sorted);
        myGridView.PageIndexChanged += new EventHandler(myGridView_PageIndexChanged);
        myGridView.PageSizeChanged += new EventHandler(myGridView_PageSizeChanged);
        myGridView.PageSizeChanging += new EventHandler(myGridView_PageSizeChanging);
        myGridView.SelectionType = this.mySelectionType;
        myGridView.SelectColumnIndex = this.mySelectColumnIndex;
        myGridView.PageSize = this.myPageSize;
        myGridView.PageIndex = this.myPageIndex;
        myGridView.CssClass = this.myGridViewCssClass;
        myGridView.CustomPagerButtonCssStyle = this.myCustomPagerButtonCssClass;
        myGridView.CustomPagerTextBoxCssStyle = this.myCustomPagerTextBoxCssClass;
        myGridView.RowStyle.CssClass = this.myRowCssClass;
        myGridView.EmptyDataRowStyle.CssClass = this.myEmptyDataRowCssClass;
        myGridView.PagerStyle.CssClass = this.myPagerCssClass;
        myGridView.SelectedRowStyle.CssClass = this.mySelectedRowCssClass;
        myGridView.HeaderStyle.CssClass = this.myHeaderCssClass;
        myGridView.AlternatingRowStyle.CssClass = this.myAlternatingRowCssClass;
        myGridView.DisabledRowCssClass = this.myDisabledRowCssClass;
        myGridView.DisabledValues = this.myGridViewDisabledValues;
        myGridView.SelectedValues = this.myGridViewSelectedValues;
        myGridView.GridLines = this.myGridLines;
        parser.CreateGridViewColumns(ref myGridView);


        // Define the object data source
        myObjectDataSource = new ObjectDataSource();
        myObjectDataSource.ID = "ods" + Enum.GetName(typeof(SearchGridType), this.myType);
        myObjectDataSource.OldValuesParameterFormatString = "original_{0}";
        myObjectDataSource.SelectMethod = "GetList";
        myObjectDataSource.SelectCountMethod = "SelectCountForGetList";
        myObjectDataSource.TypeName = "MyCompany.DCO.MyProject.Bll." + Enum.GetName(typeof(SearchGridType), this.myType) + "Manager";
        myObjectDataSource.EnablePaging = true;
        myObjectDataSource.StartRowIndexParameterName = "startRowIndex";
        myObjectDataSource.MaximumRowsParameterName = "maximumRows";
        myObjectDataSource.SortParameterName = "SortExpression";
        myObjectDataSource.Selecting += new ObjectDataSourceSelectingEventHandler(myObjectDataSource_Selecting);
        myObjectDataSource.Selected += new ObjectDataSourceStatusEventHandler(myObjectDataSource_Selected);


        // Add the defined controls
        this.Controls.Add(myObjectDataSource);
        this.Controls.Add(myGridView);
        this.Controls.Add(mySearchParametersPanel);

        parser.SetSearchPanelControls<T>(this.mySearchCriteria, ref mySearchParametersPanel);

    }

    protected override void Render(HtmlTextWriter writer)
    {
        AddAttributesToRender(writer);

        writer.RenderBeginTag(HtmlTextWriterTag.Div);

        mySearchParametersPanel.RenderControl(writer);
        writer.RenderBeginTag(HtmlTextWriterTag.Br);
        writer.RenderEndTag();

        myGridView.RenderControl(writer);
        writer.RenderBeginTag(HtmlTextWriterTag.Br);
        writer.RenderEndTag();

        myObjectDataSource.RenderControl(writer);
        writer.RenderEndTag();
    }
    #endregion

}

Вот код для файла "parser", который создает пользовательские элементы управления:

    class SearchGridParser_ApplicationFunction : SearchGridParser
{
    internal override void CreateGridViewColumns(ref MyCompanygridview myGridView)
    {
        // Link Column
        HyperLinkField linkColumn = new HyperLinkField();
        linkColumn.Text = "Edit";
        linkColumn.HeaderText = "ID";
        linkColumn.DataNavigateUrlFields = new string[] { "ID" };
        linkColumn.DataNavigateUrlFormatString = "~/AddEdit/ApplicationFunction/default.aspx?Action=Edit&ID={0}";
        myGridView.Columns.Add(linkColumn);

        // Name Column
        BoundField nameColumn = new BoundField();
        nameColumn.DataField = "Name";
        nameColumn.HeaderText = "Name";
        nameColumn.SortExpression = "Name";
        myGridView.Columns.Add(nameColumn);

        // Description Column
        BoundField descriptionColumn = new BoundField();
        descriptionColumn.DataField = "Description";
        descriptionColumn.HeaderText = "Description";
        descriptionColumn.SortExpression = "Description";
        myGridView.Columns.Add(descriptionColumn);

        // Business Criticality Column
        TemplateField businessCriticalityColumn = new TemplateField();
        businessCriticalityColumn.SortExpression = "BusinessCriticality";
        businessCriticalityColumn.HeaderText = "Criticality";
        businessCriticalityColumn.ItemTemplate = new LabelColumnGridViewTemplate(ListItemType.Item, "BusinessCriticality", "Name");
        myGridView.Columns.Add(businessCriticalityColumn);

        // Disabled Column
        CheckBoxField disabledColumn = new CheckBoxField();
        disabledColumn.DataField = "DisabledFlg";
        disabledColumn.HeaderText = "Disabled";
        disabledColumn.SortExpression = "DisabledFlg";
        myGridView.Columns.Add(disabledColumn);

        // Agencies Column
        TemplateField agenciesColumn = new TemplateField();
        agenciesColumn.HeaderText = "Agencies";
        agenciesColumn.ItemTemplate = new ChildObjectsGridViewTemplate(ListItemType.Item, 2, "Agencies", "Agency.Abbreviation");
        myGridView.Columns.Add(agenciesColumn);

        // Applications Column
        TemplateField applicationsColumn = new TemplateField();
        applicationsColumn.HeaderText = "Applications";
        applicationsColumn.ItemTemplate = new ChildObjectsGridViewTemplate(ListItemType.Item, 2, "Applications", "Application.Name");
        myGridView.Columns.Add(applicationsColumn);
    }

    internal override void CreateSearchPanelControls(ref Panel myPanel, Dictionary<SearchPanelControlType, string> myStyleDictionary)
    {
        if (myStyleDictionary == null)
        {
            myStyleDictionary = new Dictionary<SearchPanelControlType, string>();
        }

        // Title
        Literal myTitleStart = new Literal();
        myTitleStart.Text = "<h4>";

        Label myTitle = new Label();
        myTitle.Text = "Application Function:";
        myTitle.ID = "lblTitle";

        Literal myTitleEnd = new Literal();
        myTitleEnd.Text = "</h4>";



        // Begin Table
        Table myTable = new Table();
        myTable.ID = "myTable";

        // Create First Row
        TableRow myTableRow1 = new TableRow();
        myTableRow1.ID = "myTableRow1";

        // Search by Name
        TableCell myNameLabelTableCell = new TableCell();
        myNameLabelTableCell.ID = "myNameLabelTableCell";
        Label myNameLabel = new Label();
        myNameLabel.ID = "lblName";
        myNameLabel.Text = "Name:";
        myNameLabel.AssociatedControlID = "txtName";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.Label))
        {
            myNameLabel.CssClass = myStyleDictionary[SearchPanelControlType.Label];
        }
        myNameLabelTableCell.Controls.Add(myNameLabel);
        myTableRow1.Cells.Add(myNameLabelTableCell);

        TableCell myNameUserInputTableCell = new TableCell();
        myNameUserInputTableCell.ID = "myNameUserInputTableCell";
        TextBox myNameTextBox = new TextBox();
        myNameTextBox.ID = "txtName";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.TextBox))
        {
            myNameTextBox.CssClass = myStyleDictionary[SearchPanelControlType.TextBox];
        }
        myNameUserInputTableCell.Controls.Add(myNameTextBox);
        myTableRow1.Cells.Add(myNameUserInputTableCell);


        // Search by Agency
        TableCell myAgencyLabelTableCell = new TableCell();
        myAgencyLabelTableCell.ID = "myAgencyLabelTableCell";
        Label myAgencyLabel = new Label();
        myAgencyLabel.ID = "lblAgency";
        myAgencyLabel.Text = "Agency:";
        myAgencyLabel.AssociatedControlID = "ddlAgency";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.Label))
        {
            myAgencyLabel.CssClass = myStyleDictionary[SearchPanelControlType.Label];
        }
        myAgencyLabelTableCell.Controls.Add(myAgencyLabel);
        myTableRow1.Cells.Add(myAgencyLabelTableCell);

        TableCell myAgencyUserInputTableCell = new TableCell();
        myAgencyUserInputTableCell.ID = "myAgencyUserInputTableCell";
        DropDownList<AgencyCriteria> myAgencyDDL = new DropDownList<AgencyCriteria>();
        myAgencyDDL.Type = DropDownListType.Agency;
        myAgencyDDL.ID = "ddlAgency";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.DropDownList))
        {
            myAgencyDDL.CssClass = myStyleDictionary[SearchPanelControlType.DropDownList];
        }
        myAgencyDDL.DisplayDisabled = true;
        myAgencyDDL.EnableAnyOption = true;
        myAgencyDDL.DataBind();
        myAgencyUserInputTableCell.Controls.Add(myAgencyDDL);
        myTableRow1.Cells.Add(myAgencyUserInputTableCell);


        myTable.Rows.Add(myTableRow1);

        // Create Second row
        TableRow myTableRow2 = new TableRow();
        myTableRow2.ID = "myTableRow2";


        // Search by BusinessCriticality
        TableCell myBusinessCriticalityLabelTableCell = new TableCell();
        myBusinessCriticalityLabelTableCell.ID = "myBusinessCriticalityLabelTableCell";
        Label myBusinessCriticalityLabel = new Label();
        myBusinessCriticalityLabel.ID = "lblBusinessCriticality";
        myBusinessCriticalityLabel.Text = "Criticality:";
        myBusinessCriticalityLabel.AssociatedControlID = "ddlBusinessCriticality";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.Label))
        {
            myBusinessCriticalityLabel.CssClass = myStyleDictionary[SearchPanelControlType.Label];
        }
        myBusinessCriticalityLabelTableCell.Controls.Add(myBusinessCriticalityLabel);
        myTableRow2.Cells.Add(myBusinessCriticalityLabelTableCell);

        TableCell myBusinessCriticalityUserInputTableCell = new TableCell();
        myBusinessCriticalityUserInputTableCell.ID = "myBusinessCriticalityUserInputTableCell";
        DropDownList<LookupCodeCriteria> myBusinessCriticalityDDL = new DropDownList<LookupCodeCriteria>();
        myBusinessCriticalityDDL.Type = DropDownListType.LookupCode;
        myBusinessCriticalityDDL.ID = "ddlBusinessCriticality";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.DropDownList))
        {
            myBusinessCriticalityDDL.CssClass = myStyleDictionary[SearchPanelControlType.DropDownList];
        }
        myBusinessCriticalityDDL.DisplayDisabled = true;
        myBusinessCriticalityDDL.EnableAnyOption = true;
        LookupCodeCriteria myBusinessCriticalityCriteria = new LookupCodeCriteria();
        myBusinessCriticalityCriteria.Type = LookupCodeType.BusinessCriticality;
        myBusinessCriticalityDDL.OtherCriteria = myBusinessCriticalityCriteria;
        myBusinessCriticalityDDL.DataBind();
        myBusinessCriticalityUserInputTableCell.Controls.Add(myBusinessCriticalityDDL);
        myTableRow2.Cells.Add(myBusinessCriticalityUserInputTableCell);

        // Search by DisabledFlg
        TableCell myDisabledFlgLabelTableCell = new TableCell();
        myDisabledFlgLabelTableCell.ID = "myDisabledFlgLabelTableCell";
        Label myDisabledFlgLabel = new Label();
        myDisabledFlgLabel.ID = "lblDisabledFlg";
        myDisabledFlgLabel.Text = "Disabled:";
        myDisabledFlgLabel.AssociatedControlID = "ddlDisabledFlg";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.Label))
        {
            myDisabledFlgLabel.CssClass = myStyleDictionary[SearchPanelControlType.Label];
        }
        myDisabledFlgLabelTableCell.Controls.Add(myDisabledFlgLabel);
        myTableRow2.Cells.Add(myDisabledFlgLabelTableCell);

        TableCell myDisabledFlgUserInputTableCell = new TableCell();
        myDisabledFlgUserInputTableCell.ID = "myDisabledFlgUserInputTableCell";
        YesNoAnyDropDownList myDisabledFlgDDL = new YesNoAnyDropDownList();
        myDisabledFlgDDL.ID = "ddlDisabledFlg";
        if (myStyleDictionary.ContainsKey(SearchPanelControlType.DropDownList))
        {
            myDisabledFlgDDL.CssClass = myStyleDictionary[SearchPanelControlType.DropDownList];
        }
        myDisabledFlgDDL.DataBind();
        myDisabledFlgUserInputTableCell.Controls.Add(myDisabledFlgDDL);
        myTableRow2.Cells.Add(myDisabledFlgUserInputTableCell);

        myTable.Rows.Add(myTableRow2);


        myPanel.Controls.Add(myTitleStart);
        myPanel.Controls.Add(myTitle);
        myPanel.Controls.Add(myTitleEnd);
        myPanel.Controls.Add(myTable);
    }

    internal override void FillSearchCriteria<T>(T myCriteria, ref Panel myPanel)
    {
        ApplicationFunctionCriteria derivedCriteria = new ApplicationFunctionCriteria();
        if (myCriteria != null)
        {
            derivedCriteria = myCriteria as ApplicationFunctionCriteria;
        }

        // Name
        TextBox myNameTextBox = (TextBox)myPanel.FindControl("myTable").FindControl("myTableRow1").FindControl("myNameUserInputTableCell").FindControl("txtName");
        if (!string.IsNullOrEmpty(myNameTextBox.Text.Trim()))
        {
            derivedCriteria.Name = myNameTextBox.Text.Trim();
        }
        else
        {
            derivedCriteria.Name = string.Empty;
        }

        // AgencyID
        DropDownList<AgencyCriteria> myAgencyDDL = (DropDownList<AgencyCriteria>)myPanel.FindControl("myTable").FindControl("myTableRow1").FindControl("myAgencyUserInputTableCell").FindControl("ddlAgency");
        Guid myAgencyID;
        if (myAgencyDDL.SelectedValue.TryParseGuid(out myAgencyID))
        {
            derivedCriteria.AgencyID = myAgencyID;
        }
        else
        {
            derivedCriteria.AgencyID = null;
        }

        // BusinessCriticalityID
        DropDownList<LookupCodeCriteria> myBusinessCriticalityDDL = (DropDownList<LookupCodeCriteria>)myPanel.FindControl("myTable").FindControl("myTableRow2").FindControl("myBusinessCriticalityUserInputTableCell").FindControl("ddlBusinessCriticality");
        Guid myBusinessCriticalityID;
        if (myBusinessCriticalityDDL.SelectedValue.TryParseGuid(out myBusinessCriticalityID))
        {
            derivedCriteria.BusinessCriticalityID = myBusinessCriticalityID;
        }
        else
        {
            derivedCriteria.BusinessCriticalityID = null;
        }

        // DisabledFlg
        YesNoAnyDropDownList myDisabledFlgDDL = (YesNoAnyDropDownList)myPanel.FindControl("myTable").FindControl("myTableRow2").FindControl("myDisabledFlgUserInputTableCell").FindControl("ddlDisabledFlg");
        bool myDisabledFlg;
        if (bool.TryParse(myDisabledFlgDDL.SelectedValue, out myDisabledFlg))
        {
            derivedCriteria.DisabledFlg = myDisabledFlg;
        }
        else
        {
            derivedCriteria.DisabledFlg = null;
        }

    }

    internal override void SetSearchPanelControls<T>(T myCriteria, ref Panel myPanel)
    {
        ApplicationFunctionCriteria derivedCriteria = new ApplicationFunctionCriteria();
        if (myCriteria != null)
        {
            derivedCriteria = myCriteria as ApplicationFunctionCriteria;
        }

        // Name
        TextBox myNameTextBox = (TextBox)myPanel.FindControl("myTable").FindControl("myTableRow1").FindControl("myNameUserInputTableCell").FindControl("txtName");
        myNameTextBox.Text = derivedCriteria.Name;

        // AgencyID
        DropDownList<AgencyCriteria> myAgencyDDL = (DropDownList<AgencyCriteria>)myPanel.FindControl("myTable").FindControl("myTableRow1").FindControl("myAgencyUserInputTableCell").FindControl("ddlAgency");
        if (derivedCriteria.AgencyID.HasValue)
        {
            myAgencyDDL.SelectedValue = derivedCriteria.AgencyID.ToString();
        }
        else
        {
            myAgencyDDL.SelectedValue = "0";
        }

        // BusinessCriticalityID
        DropDownList<LookupCodeCriteria> myBusinessCriticalityDDL = (DropDownList<LookupCodeCriteria>)myPanel.FindControl("myTable").FindControl("myTableRow2").FindControl("myBusinessCriticalityUserInputTableCell").FindControl("ddlBusinessCriticality");
        if (derivedCriteria.BusinessCriticalityID.HasValue)
        {
            myBusinessCriticalityDDL.SelectedValue = derivedCriteria.BusinessCriticalityID.ToString();
        }
        else
        {
            myBusinessCriticalityDDL.SelectedValue = "0";
        }

        // DisabledFlg
        YesNoAnyDropDownList myDisabledFlgDDL = (YesNoAnyDropDownList)myPanel.FindControl("myTable").FindControl("myTableRow2").FindControl("myDisabledFlgUserInputTableCell").FindControl("ddlDisabledFlg");
        if (derivedCriteria.DisabledFlg.HasValue)
        {
            myDisabledFlgDDL.SelectedValue = derivedCriteria.DisabledFlg.ToString();
        }
        else
        {
            myDisabledFlgDDL.SelectedValue = "any";
        }

    }
}

Вот код на странице aspx, который я использую для проверки элемента управления:

    <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
    </div>
    </form>
</body>
</html>

И код позади:

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CustomWebControls.SearchGrid<AccountCriteria> myAppFuncGrid = new      MyCompany.DCO.MyProject.CustomWebControls.SearchGrid<AccountCriteria>();
        myAppFuncGrid.Type = MyCompany.DCO.MyProject.CustomWebControls.SearchGridType.Account;
        myAppFuncGrid.SelectionType = MyCompany.DCO.Library.WebControls.MyCompanygridviewSelectionType.Multiple;
        myAppFuncGrid.PageSize = 3;
        PlaceHolder1.Controls.Add(myAppFuncGrid);
    }
}

Я также пытался поместить только элемент управления в if (! Page.IsPostBack), но тогда он даже вообще не отображает элемент управления в Postback. Что я делаю не так?

UPDATE: Поэтому я добавил это в составной элемент управления:

protected override void OnInit(EventArgs e) 
{ 
 this.CreateChildControls(); base.OnInit(e); 
} 

И теперь я больше не получаю сообщение об ошибке «не удалось загрузить viewstate», но, похоже, что viewstate дочерних элементов управления не сохраняется через обратные передачи. Одним из элементов управления в моем составном элементе управления является просмотр сетки с включенной подкачкой страниц, и при нажатии на следующую страницу он переходит на вторую страницу, но не на страницу 3, 4 или около того. Но он перейдет на «последнюю страницу», «первую страницу» без проблем. Но Следующая страница и Предыдущая страница не работают правильно, но также не выдают ошибку. Идеи?

1 Ответ

0 голосов
/ 18 октября 2010

При динамическом добавлении элемента управления на страницу попробуйте переопределить OnInit или CreateChildControls и сделать это там.

Viewstate загружается на этапе предварительной загрузки и, следовательно, не может загружать viewstate для ваших элементов управления, поскольку онипока существует ...

...