Обратная передача уничтожает пользовательские элементы управления в моих столбцах GridView - PullRequest
3 голосов
/ 07 января 2009

У меня есть ASP.NET GridView, который использует шаблонные столбцы и пользовательские элементы управления, чтобы позволить мне динамически создавать сетку данных. Сейчас я реализую обработчик событий для вставки строки. Для этого я создаю массив значений по умолчанию и добавляю его в таблицу данных, которая выступает в качестве источника данных. Однако, когда мое событие OnLoad запускается при обратной передаче, все мои столбцы шаблона больше не имеют пользовательских элементов управления. Мое сеточное представление в итоге становится пустым, в нем ничего нет, и мой столбец кнопок также исчезает (который содержит кнопки добавления строки, удаления строки и сохранения).

Мой случай добавления строки просто делает это:

    public void AddDataGridRow()
    {
        List<object> defRow = new List<object>();

        for (int i = 0; i < fieldNames.Count; i++)
        {
            defRow.Add(GetDefaultValueFromDBType(types[i]));   
        }

        dt.Rows.Add(defRow);
    }

Он вызывается кнопкой в ​​пользовательском элементе управления, который реализован следующим образом:

    protected void Button1_Click(object sender, EventArgs e)
    {
        ((Scoresheet)(this.Page)).AddDataGridRow();
    }

Событие My on load выполняет кучу вещей при первом запуске, чтобы настроить GridView, но я не запускаю его снова, используя свойство IsPostBack, чтобы сообщить.

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

У кого-нибудь есть намеки, почему мои пользовательские элементы управления исчезают?

Ответы [ 3 ]

3 голосов
/ 07 января 2009

Вы должны добавлять элементы управления в сетку при каждой загрузке страницы, а не только, если это (! Postback)

0 голосов
/ 07 января 2009

Вызывается ли метод AddDataGridRow () функцией Initialize ()? У вас есть два варианта:

  1. Свяжите сетку на каждой обратной передаче и не используйте viewstate (потеря производительности)
  2. Связывайте сетку только в первый раз (если (! IsPostBack)) и убедитесь, что ваши пользовательские элементы управления сохраняют свое состояние просмотра.

Из вашего кода неясно, сохраняют ли пользовательские элементы управления состояние просмотра и что они имеют в них. Даже не ясно, каков порядок выполнения методов, которые вы показали. Здесь нет логики привязки, поэтому, даже если вы продолжаете добавлять строки, сетка может все еще не быть связанной. Пожалуйста, уточните немного и покажите весь код страницы позади.

0 голосов
/ 07 января 2009

У вас есть EnableViewState = true для пользовательских элементов управления и GridView?

...