Повторитель в моем пользовательском контроле пуст при обратной передаче - PullRequest
0 голосов
/ 20 июля 2010

Я рассмотрел много подобных вопросов здесь, но безрезультатно.

Итак, вот так ...

Я создаю набор пользовательских элементов управления, которые отображаютсписок сеткообразных таблиц.В любом случае, цель состоит в том, чтобы перечислить сетки, связываться с данными каждой сетки (на стороне клиента) и нажать «Сохранить».Сетки работают отлично, но когда я нажимаю «Сохранить», повторитель в VIEWER всегда пуст.Любая помощь приветствуется!

Основной макет выглядит следующим образом

  1. PAGE
  2. ... updatePANEL
  3. ...... usercontrolVIEWER
  4. ......... saveBUTTON
  5. ......... repeaterCONTROL
  6. ............ usercontrolGRID
  7. ............ usercontrolGRID
  8. ............ ETC!

Страница выглядит следующим образом

<asp:Content ID="Content2" ContentPlaceHolderID="body" runat="server">
    <asp:UpdatePanel id="udPanel" UpdateMode="Always" runat="server">
            <Triggers>
            </Triggers>
            <ContentTemplate>
               <uc:CommitImporterView ID="civData" runat="server" />
            </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

public partial class CommitsAndActualsImporter : BaseForm
{
    #region EVENTS

    protected void Page_Init(object sender, EventArgs e)
    {
        setUpEventHandlers();

        if (!IsPostBack)
            initalize();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void myListOfGroups_DataBinding(object sender, EventArgs e)
    {
        //.. Code to bind the list goes here ...

        myListOfGroups.SelectedIndex = setSelectedIndex(collection);
    }
    protected void myListOfGroups_SelectedIndexChanged(object sender, EventArgs e)
    {
        myGroup = myListOfGroups.Find(selectedItem => selectedItem.Key == key);
        dataSource = buildViewDataSource(base.ProjectKey, base.AsOf, myGroup.FcrGroupKey, myGroup.ContractorKey, myGroup.WbsKey);

        civData.AsOf = base.AsOf;
        civData.ProjectKey = base.ProjectKey;
        civData.DataSource = dataSource;
        civData.DataBind();
    }

    #endregion

    #region METHODS

    private void initalize()
    {
        ContractorInviteItems dataSource = listGroups(ProjectKey, AsOf);
        myListOfGroups.DataSource = dataSource;
        myListOfGroups.DataBind();
    }
    private void setUpEvents()
    {
        myListOfGroups.DataBinding += new EventHandler(myListOfGroups_DataBinding);
        myListOfGroups.SelectedIndexChanged += new EventHandler(myListOfGroups_SelectedIndexChanged);
    }

    #endregion
}

Пользовательский элемент управления VIEWER выглядит следующим образом

<%@ Register Src="~/UserControls/CommitImporterGrid.ascx" TagName="CommitImporterGrid" TagPrefix="uc" %>

<asp:Button ID="btnSave" runat="server" Text="Save" />

<asp:HiddenField ID="hidAsOf" runat="server" Value="" />
<asp:HiddenField ID="hidProjectKey" runat="server" Value="0" />

<asp:Repeater ID="repCommitImporterView" runat="server">
    <ItemTemplate>
        <uc:CommitImporterGrid runat="server" />
    </ItemTemplate>
</asp:Repeater>

public partial class CommitImporterView : System.Web.UI.UserControl
{
    #region PROPERTIES & FIELDS

    private enum basisUsed
    {
        Dollars,
        Hours,
        IsInvalid
    }

    public Object DataSource { get; set; }

    public DateTime AsOf { get { return Convert.ToDateTime(hidAsOf.Value); } set { hidAsOf.Value = value.ToString(); } }
    public Int32 ProjectKey { get { return Convert.ToInt32(hidProjectKey.Value); } set { hidProjectKey.Value = value.ToString(); } }

    #endregion

    #region EVENTS

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        setupEvents();
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.DataBind();
    }
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
    }

    public override void DataBind()
    {
        base.DataBind();
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        Int32 count = repCommitImporterView.Controls.Count;

        foreach (Control control in repCommitImporterView.Controls)
        {
            if (control is UserControls.CommitImporterGrid)
            {
                string stop = "";
            }

        }
    }

    protected void repCommitImporterView_DataBinding(object sender, EventArgs e)
    {
        if (DataSource == null)
            return;

        if (!IsPostBack)
        {
            Decimal totalSummaryCbudDollars = 0;
            Decimal totalSummaryCbudHours = 0;

            if (summaryValuesExist(out totalSummaryCbudDollars, out totalSummaryCbudHours))
                alignSummarizedRecords(totalSummaryCbudDollars, totalSummaryCbudHours);

            repCommitImporterView.DataSource = DataSource;
        }
    }
    protected void repCommitImporterView_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        ContractorInviteCommitsAndActualsImport record = (ContractorInviteCommitsAndActualsImport)e.Item.DataItem;
        CommitImporterGrid grid = new CommitImporterGrid();
        grid = (UserControls.CommitImporterGrid)Page.LoadControl("~/UserControls/CommitImporterGrid.ascx") as UserControls.CommitImporterGrid;

        grid.AsOf = this.AsOf;
        grid.ProjectKey = this.ProjectKey;

        grid.DataSource = getDataSource(record);
        grid.DataBind();

        repCommitImporterView.Controls.Add(grid);
    }

    #endregion

    #region METHODS

    private void setupEvents()
    {
        btnSave.Click += new EventHandler(btnSave_Click);

        repCommitImporterView.DataBinding += new EventHandler(repCommitImporterView_DataBinding);
        repCommitImporterView.ItemDataBound += new RepeaterItemEventHandler(repCommitImporterView_ItemDataBound);
    }

    #endregion
}

TheПользовательский элемент управления GRID выглядит как

1 Ответ

1 голос
/ 20 июля 2010

Похоже, что вы привязываете элемент управления Viewer только тогда, когда пользователь изменяет DropDownList, и он не привязывается, когда страница / элемент управления загружается, либо при начальной загрузке, либо при обратной передаче. если вы не связываете повторитель при обратной передаче, у него не будет ожидаемых элементов данных.

Я бы извлек содержимое myListOfGroups_SelectedIndexChanged в закрытый метод и вызвал бы его из myListOfGroups_SelectedIndexChanged, а затем вызвал бы его из Page_Load независимо от состояния IsPostBack (убедитесь, что он называется ПОСЛЕ того, как вы связываете данные myListOfGroups). когда вы вызываете его из Page_Load, он получает выбор пользователя из DropDownList и повторно связывает элемент управления Viewer, который связывает Repeater.

Ключевым моментом здесь является то, что вам всегда нужно связывать повторители при каждой загрузке страницы, независимо от значения IsPostBack. иначе в повторителе ничего не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...