GridView RowDataBound не стреляет в обратную передачу

Подготовка

Установка необходимых npm пакетов

npm install typescript
npm install gulp@^4.0.0                
npm install gulp-typescript@^5.0.0
npm install del
npm install ts-nameof

gulp-typescript БЕЗ проекта

Подготовка gulpfile.js

const gulp = require('gulp');
const ts = require('gulp-typescript');
const tsNameof = require("ts-nameof");
const del = require('del');

gulp.task('clean', () => {
    return del(['./dist/**']);
});    

gulp.task('ts', function () {
    return gulp.src('./src/**/*.ts')
        .pipe(ts({
            getCustomTransformers: () => ({ before: [tsNameof] })
        }))
        .pipe(gulp.dest('./dist'));
});

gulp.task('default',
    gulp.series(
        'clean',
        'ts',
    ));

gulp-typescript С проектом, использующим существующее tsconfig.json

Используя gulp-typescript с существующим tsconfig.json, необходимо настроить gulpfile.js там, где настроена опция getCustomTransformers:

Подготовка gulpfile.js

const gulp = require('gulp');
const ts = require('gulp-typescript');
const tsNameof = require("ts-nameof");
const del = require('del');

gulp.task('clean', () => {
    return del(['./dist/**']);
}); 

var tsProject = tsProject || null;
gulp.task('ts::Project', function () {
    if (!tsProject) {
        tsProject = ts.createProject(
            'tsconfig.json',
            {
                getCustomTransformers: () => ({ before: [tsNameof] })
            }
        );
    }
    return gulp.src('./src/**/*.ts')
        .pipe(tsProject())
        .pipe(gulp.dest("./dist"));
});

gulp.task('tsProject',
    gulp.series(
        'clean',
        'ts::Project',
    ));

Транспилирование

Выполнить gulpfile.js с

./node_modules/.bin/gulp

или

./node_modules/.bin/gulp tsProject

Выполнение

Выполнить переданный файл tsNameofTest.js

node dist/tsNameofTest.js  // expected output: nameString: log

Примечание: если цель typescript равна ESNext, я получил ошибки выполнения со следующим оператором в файле .ts, как это было в финале Файл .js тоже:

import 'ts-nameof';

Я получил исправлено, заменив его на

/// <reference path="../node_modules/ts-nameof/ts-nameof.d.ts" />

Обновление

Теперь даже можно установить определение типа из ts-nameof во всем мире:

npm install @types/ts-nameof --save-dev

Ни import, ни /// <reference path="" /> не является необходимым.

7
задан Ryan Lundy 11 November 2008 в 15:21
поделиться

6 ответов

Вот то, как я закончил тем, что решил это:

  1. Я создал сериализуемый класс со свойствами только для чтения: PK строки и булевская переменная для каждой ссылки, указывающей, включено ли это или нет. Мы назовем его LinkVisibility.
  2. Я создал сериализуемый класс, наследовавшийся KeyedCollection для содержания экземпляров класса выше.
  3. Я создал Поддержанные состоянием отображения имущественные ценности экземпляр того набора.
  4. В моей Поисковой процедуре (заполняющий GridView), я очищаю набор.
  5. В RowDataBound, который первоначально показывает/скрывает ссылки, я добавляю a LinkVisibility экземпляр к набору для каждой строки.
  6. На Странице. Загрузка, когда IsPostBack верен, я циклично выполняюсь через строки GridView. Я ищу LinkVisibility для каждого PK в наборе (DataKeyNames установлен в GridView), и я установил ссылки соответственно.

Я не знаю, что это - лучший способ сделать это, но он, конечно, работает, который является больше, чем я могу сказать для чего-либо еще, что попробовал.

2
ответ дан 7 December 2019 в 10:10
поделиться

1) У Вас мог быть Метод - ProcessDataRows (), который назвать однажды на grid_DataBound (...). И затем когда Вам нужен он после PostBack.

И тот способ, которым Вы обрабатываете все строки, когда Вы хотите.

2) У Вас могли быть методы как ShowParentLink (). Это затем связывается с LinkButton в сетке (если бы Вы используете ItemTemplate), и ссылка имела бы

Visible='<%#ShowParentLink()%>'
1
ответ дан 7 December 2019 в 10:10
поделиться

Я ожидал бы, что состояние отображения также отразит то, что Вы удалили некоторые ссылки (предполагающий, что они были удалены, прежде чем состояние отображения было сохранено).

Возможно, это - вопрос, который необходимо задать, 'почему удаленные ссылки все еще появляются в состоянии отображения?'.

0
ответ дан 7 December 2019 в 10:10
поделиться

Страница не может обработать события возврата, если она не восстановлена точно, как это было прежде (обратная передача). Если Вы повторно скрываете свои ссылки во время страницы-init, то Ваши события щелчка и такой должны стрелять. К сожалению, не видя некоторый пример кода я не могу стать более конкретным.

Также RowDataBound данных не стреляет, потому что Вы не привязка данных. Вы восстанавливаете страницу от состояния отображения - "привязка состояния отображения" из-за отсутствия лучшего слова.

0
ответ дан 7 December 2019 в 10:10
поделиться
void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}
0
ответ дан 7 December 2019 в 10:10
поделиться

Другое решение состоит в том, чтобы поместить логику в запрос LINQ, так, чтобы Вы закончили с булевым полем LINQ как "ShowParentLink". Затем можно просто связать Свойство видимости поля HyperLink к тому значению - никакой требуемый RowDataBound.

0
ответ дан 7 December 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: