У меня есть приложение с CXGrid в форме с парой ячеек. Мне нужно иметь возможность редактировать значение в ячейке, и мне нужно обновить значение прямо в ячейке. Прочитав, я вижу, что для обеспечения возможности редактирования необходимо установить два основных свойства:
GridMainDBTableView1.OptionsData.Editing := True;
GridMainDBTableView1TotalCount.Editing := True;
Столбец, значение которого необходимо изменить, — это столбец TotalCount. Когда я запускаю приложение и пытаюсь отредактировать значение, я вижу, что ячейка доступна для редактирования, поскольку мой курсор появляется внутри ячейки, я могу выделить текущее целочисленное значение, которое находится там внутри, но я никогда не могу его редактировать. Он никогда не принимает вводимые мной символы и даже не может удалить текущее значение для ввода нового значения. Больше ничего не происходит, кроме появления курсора внутри ячейки, что также указывает на то, что режим «только для чтения» является ложным. но ничего не происходит, мне никогда не удается изменить значение. Есть ли что-нибудь еще, что я мог пропустить. Я прочитал несколько сообщений здесь и на DevExpress, но не смог найти работающего решения. Большинство, если не все, решений указывают на то, что нам нужно изменить значения, приведенные выше.
Я пытался даже выставить код на показ, чтобы убедиться, что для редактирования столбцов действительно установлено значение True и т. д., но все равно ничего не меняется. Единственный раз, когда я вижу изменения в форме, это когда я делаю ее доступной только для чтения, тогда мой курсор больше не появляется в ячейке.
Обновлено: Когда я запрашиваю БД, чтобы получить значения, которые необходимо заполнить сетку, столбец, в котором я хочу изменить значения, запрашивается следующим образом:
' ROUND(COALESCE(T0.TotalCount,0),T1.QtyDecimal) AS TotalCount, ';
Может ли это быть причиной того, что оно несъедобно?
@FreddieBell обе эти опции установлены, как вы указали в своем ответе. и ничего не меняется динамически при отображении формы с сеткой.
Курсор, появляющийся в ячейке, не означает, что она не предназначена только для чтения, просто ее содержимое можно выбрать, что необходимо, чтобы пользователь мог, например, скопировать часть значения ячейки. Существует множество причин, по которым поле может быть недоступно для редактирования: это может быть вычисляемое поле (уровень Tdataset), сводное поле (cxgrid) или поле, недоступное для редактирования из базы данных (независимо от того, какой запрос и база данных послужили источником данных). Необходимо предоставить более подробную информацию, чтобы не перечислять все случаи, когда поле может быть недоступно для редактирования.
Недавно у меня возникла именно эта проблема. Я обнаружил, что для свойства readonly компонента таблицы базы данных установлено значение true по какой-то странной причине, вероятно, из-за ошибочного нажатия клавиши с моей стороны при настройке свойств компонента TTable.
@Brian Вы действительно правы, я установил для свойств, которые должны быть истинными, как указано выше, значение True, но редактирование по-прежнему не происходит. Источник данных не предназначен только для чтения, поэтому я понятия не имею, где еще искать настройку.
Ни одна известная мне база данных не вернет такой столбец результатов, используя формулу, доступную для редактирования. Я бы предложил, чтобы сетка выполняла форматирование с помощью запроса, просто возвращающего необходимые поля. Либо в качестве спецификатора формата для столбца сетки, либо в его OnGetDisplayText.
@ Брайан, я также выпустил то, что вы не можете редактировать вычисляемое поле, тогда возникает вопрос, как мне сохранить обновленное значение с правильными десятичными знаками. Теперь мое значение в TotalCount теперь можно изменить, но оно не сохраняет правильное значение внутри базы данных с требованием десятичного числа. Он сохраняет введенное мной значение, отредактированное значение, и сохраняет его. Я попытался поместить код в процедуру GridMainDBTableView1CellValueChanged, но он использует не измененное значение, а исходное значение, хранящееся в файле. клетка.
Одним из мест может быть уровень TDataSet (вероятно, компонента запроса в данном случае) с использованием обработчиков событий OnChange или BeforePost.
Итак, проблему удалось решить, следуя совету Брайана выше в комментариях. Итак, я решил проблему, выполнив следующие действия.
Я убедился, что в моем выборе используется стандартный столбец, а не вычисляемый. Затем я передал в набор данных часть десятичных вычислений, в данном случае ADOQuery. И добавил свой код в событие beforePost.
procedure TfrmSTK502.qrySTKSTakeSummaryBeforePost(DataSet: TDataSet);
begin
if qrySTKSTakeSummary.State in [dsEdit, dsInsert] then
begin
// Get QtyDecimal from your function
var QtyDecimal := getQtyDecimal();
// Round the value
var RoundedValue :=
RoundTo(qrySTKSTakeSummary.FieldByName('TotalCount').AsFloat, - QtyDecimal);
// Set the rounded value
qrySTKSTakeSummary.FieldByName('TotalCount').AsFloat := RoundedValue;
end;
end;
Это
<column>.Options.editing
, который необходимо установить. И свойство.readonly
FieldDef или TField не должно бытьreadonly
. Также для<column>.Focusing
должно быть установлено значение True.