Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 4)

Автор: tanaseduard
Дата сообщения: 07.01.2012 12:03
Dima335
Правильно. Запись происходит в порядке создания. Ячейка имеет Index. Если вам надо писать в конкретную ячейку то можно делать так:
cxgrid1bandedTableView1.DataController.SetValue(i,cxgrid1bandedTableView1ColumnC.Index,x)
Автор: Qwentor
Дата сообщения: 07.01.2012 19:09
В общем, нужно создать вложенную таблицу (подтаблицу) как в Access.

Конкретно, есть инвентаризационная ведомость. Есть объекты, идущие под одним инвентарным как комплект. Надо чтоб в таблице был "+" по нажатии которого раскрывался список составляющих этого комплекта.

Использую Devexpress, компонент GridControl

В общем такая проблема:
новые единичные пункты добавляются, в существующие комплекты составляющие тоже добавляются. А как создать новый комплект?
База состоит из двух таблиц "main" и "sub". В main находятся единичные экземпляры и наименования комплектов, в sub - составляющие комплектов.
Колонки следующие:
Счетчик; № по ведомости; Наименование; Дата; Инвентарный №; Заводской №; № кабинета; ФИО; Статус

main и sub связаны по колонке "№ по ведомости"

Пока получается так:


Код: Private Sub GridControl1_EmbeddedNavigator_ButtonClick(ByVal sender As Object, _
ByVal e As DevExpress.XtraEditors.NavigatorButtonClickEventArgs) _
Handles GridControl1.EmbeddedNavigator.ButtonClick

If e.Button.ButtonType = DevExpress.XtraEditors.NavigatorButtonType.Custom Then
Select Case Convert.ToString(e.Button.Tag)
Case "addCategory"

Dim row = GridView1.FocusedRowHandle
Dim valueV = GridView1.GetRowCellValue(row, "№ по ведомости")
' Вставка № по ведомости выбранной строки в подтаблицу "sub":
SubTableAdapter.InsertNumber(valueV)


End Select
End If
End Sub
Автор: andreybear
Дата сообщения: 08.01.2012 14:02
Qwentor
А можно скриншот с описанной проблемой?
Автор: Qwentor
Дата сообщения: 08.01.2012 16:15
Проблема фактически решена, но хотелось бы более красивым способом.
Вот как я сделал:

Код:

Private Sub GridControl1_EmbeddedNavigator_ButtonClick(ByVal sender As Object, _
ByVal e As DevExpress.XtraEditors.NavigatorButtonClickEventArgs) _
Handles GridControl1.EmbeddedNavigator.ButtonClick

If e.Button.ButtonType = DevExpress.XtraEditors.NavigatorButtonType.Custom Then
Select Case Convert.ToString(e.Button.Tag)
Case "addCategory"
'Dialog1.ShowDialog()

Dim row = GridView1.FocusedRowHandle
Dim valueV = GridView1.GetRowCellValue(row, "№ по ведомости")
' Вставка № по ведомости выбранной строки в подтаблицу "sub":
SubTableAdapter.InsertNumber(valueV)
SubTableAdapter.Fill(DbinvDataSet11._sub)
End Select
End If
End Sub

Private Sub UpdateDB()
Try
MainTableAdapter.Update(DbinvDataSet11.main)
SubTableAdapter.Update(DbinvDataSet11._sub)
DbinvDataSet11.AcceptChanges()


Catch ex As Exception
MsgBox("Error" & ex.Message)
End Try

End Sub

Автор: sldaac
Дата сообщения: 10.01.2012 12:54
Есть связка мастер-детайл, ***DBTableViev, надо при жимкание на кнопку расрывались все детаил. Нашел ViewData.expand(True), но почему-то расрывается только последяя запись. Где собака порылась??
Автор: Baklan_vs
Дата сообщения: 10.01.2012 15:47
Уважаемое сообщество! У меня к вам большая просьба:
Как сделать так что-бы в cxGrid представленный на скриншоте, при клике по RadioButton остальные выключались?


Uploaded with ImageShack.us
я понимаю что при клике по ячейке с батаном нужно пройтись по всем строкам и выключить остальные RadioButton, но под конец дня мозг отказывается соображать.
Большая просьба помочь рабочим кодом.
Автор: andreybear
Дата сообщения: 11.01.2012 03:58
sldaac

Код: DBViewRates.ViewData.Expand(false);
Автор: Baklan_vs
Дата сообщения: 11.01.2012 06:56
andreybear

Цитата:

Код: Sender.DataController.Values[APrevFocusedRecord.Index,0] := false;
Автор: andreybear
Дата сообщения: 11.01.2012 09:20
Т.е. вам надо, чтобы при выборе 1 строки, например, как на скриншоте для 3 оставшихся строк в базу прописались нули, а для первой 1?
И еще уточнение, используется DBView?
Автор: Baklan_vs
Дата сообщения: 11.01.2012 09:26
andreybear
да всё верно

Цитата:
чтобы при выборе 1 строки, например, как на скриншоте для 3 оставшихся строк в базу прописались нули, а для первой 1

Испозьзуется TcxGridDBTableView.
Автор: andreybear
Дата сообщения: 11.01.2012 15:52
Baklan_vs
Не знаю какие компоненты "DataAccess" используете и уровень знаний, поэтому привожу несколько вариантов с комментариями. Основной вариант реализован с использованием компонентов DOA.
[more=Подробнее...]{
Поля:
ID - идентификатор записей (на этом поле основан ключ целевой таблицы БД);
BOOL - поле, которое отвечает за отображение "положения" ("вкл", "выкл")
колонки таблицы c Properties = RadioGroup.
В Items создан 1 TcxRadioGroupItem, свойства Type = Smallint, Value = 1.
}
procedure TForm1.DBVeiwEditChanged(Sender: TcxCustomGridTableView;
AItem: TcxCustomGridTableItem);
// Событие, возникающее при изменении записи в таблице
var RecID: integer; // идентификтор исходной записи
begin
// Если изменяется целевая колонка (можно также проверить по имени колонки)
    if AItem.Index = 0 then
    // Если записей в наборе больше 1
if odsTest.RecordCount > 1 then
begin
    // Идентификатор текущей записи
RecID := odsTestID.AsInteger;
{
Можно записать odsTest.RecNo, только надо проверить
допустима ли навигация по "по номеру записи", например,
var RecNo: integer;
...
if odsTest.IsSequenced then
RecNo := odsTest.RecNo;
Либо использовать навигацию по закладкам для возврата к текущей записи.
var BkMrk: TBookmark;
...
BkMrk := odsTest.GetBook;
}
// Отключение связанных с DataSet контролов
odsTest.DisableControls;
// Установка "курсора" на первую запись набора
odsTest.First;
// Перебор всех записей набора
while not odsTest.Eof do
begin
// Если идентификатор записи не равен исходному
if odsTestID.AsInteger <> RecID then
begin
    // Если RadioButton в состоянии "вкл"
    if odsTestBOOL.AsInteger <> 0 then
    begin
    // Первод набора в режим редактирования
        odsTest.Edit;
// Установка значения поля
    odsTestBOOL.Value := 0;
{
Либо odsTest['BOOL'] := 0;
Либо odsTest.FieldByName('BOOL').AsInteger := 0;
    Либо odsTest.FieldValues['BOOL'] := 0;
Либо odsTest.Fields[0].AsInteger := 0;
}
// "Подтверждение" записи
    odsTest.Post;
    end; // if odsTestBOOL.AsInteger <> 0 then
end // if odsTestID.AsInteger <> RecID then
// Иначе установка RadioButton в положение "вкл", если не установлен
else
    if odsTestBOOL.Value <> 1 then
begin
odsTest.Edit;
odsTestBOOL.Value := 1;
odsTest.Post;
end; // if odsTestBOOL.Value <> 1 then
// Следующая запись набора
    odsTest.Next;
end; // while not odsTest.Eof do
// Возврат к исходной записи
odsTest.SearchRecord('ID', RecID, [srFromBeginning]);
{
Либо odsTest.Locate('ID', RecID, []);
Если записывался odsTest.RecNo, то odsTest.RecNo := RecNo;
Если создавалась закладка, то
if odsTest.BookmarkValid(BkMrk) then
begin
odsTest.GotoBookmark(BkMrk);
odsTest.FreeBookmark(BkMrk);
end;
}
// Подключение связанных с DataSet контролов
odsTest.EnableControls;
end;
end;[/more]
Автор: Baklan_vs
Дата сообщения: 11.01.2012 16:05
andreybear
хм.... спасибо за код =)
Решение в лоб =) по идее то-же подходит.
Но мне интересно на будущее, почему RadioGroup в CxGrid не хочет работать с числовыми значениями?
используется UniDac, БД в данный момент Firebird.
Автор: andreybear
Дата сообщения: 11.01.2012 16:30
Baklan_vs

Цитата:
Решение в лоб =)

Это точно.)) А смысл через DataController заморачиваться, ведь запись в базу будет опосредованной, а значит в итоге через то же самое место.)) К тому же, сколько не пытался найти решение "не в лоб" ничего не получилось - писать-то пишет, только принцип не понятен (переключатели начинают скакать невзирая на значение соответствующих полей). Может сам что-то не так делаю.

Цитата:
Но мне интересно на будущее, почему RadioGroup в CxGrid не хочет работать с числовыми значениями?

Если не data-aware View (TcxGridTableView) тогда все норм работает. Свойство Value в RadioGroupItem определяет значение, при котором RadioGroupItem принимает положение "вкл".
Автор: Baklan_vs
Дата сообщения: 12.01.2012 08:19
Уважаемое сообщество =)
У меня опять вопрос:
На форме присутствует dxBarEdit, использующийся в качестве фильтра.
при обработке события OnChange не могу достучаться до текста введённого в поле.
Текс становится доступным только при потере фокуса контролом.
Свойство AlwaysSaveText у BarManager включено.
Автор: wasilissk
Дата сообщения: 12.01.2012 08:28
EndEdit(False) или смотреть текст в Sender-е.
Автор: Baklan_vs
Дата сообщения: 12.01.2012 08:38
wasilissk
procedure <Form>.dxBarEdit3Change(Sender: TObject);
begin
    Edit.Text:=(Sender As TdxBarEdit).Text;
end;
Edit(Это обычный стандартный Edit, расположеный на форме)
Этот код не работает.


Цитата:
EndEdit(False)

Что это?
Автор: wasilissk
Дата сообщения: 12.01.2012 08:58

Код:
Edit.Text:=(Sender As TdxBarEdit).Text;
Автор: Baklan_vs
Дата сообщения: 12.01.2012 09:26

Цитата:
Иннер контрол может вполне быть не TdxBarEdit-ом. Проверьте в среде Sender.ClassName.

Проверил он TdxBarEdit.
отладка усложняется, так-как у меня код идёт в DLL библиотеке.. =(
Дельфя не хочет дебагить форму подключаемою в библиотеке.

Код:     
    ShowMessage(Sender.ClassName);
    Edit.Text:=(Sender As TdxBarEdit).Text;
Автор: wasilissk
Дата сообщения: 12.01.2012 09:41
Baklan_vs

Цитата:
Может мне стоит выпрямить руки и открыть глаза но этого метода найти не смог =(

Посмотрел, это не иннерконтрол эдит. Соответственно у него этого метода нет.

Попробуйте повеситься на OnCurChange.
Автор: Baklan_vs
Дата сообщения: 12.01.2012 10:03
wasilissk
Всё равно введённый текст недоступен в момент введения(когда фокус у контрола - поле ввода)
обращение к TdxBarEdit по свойству Text возвращает значение только после потери фокуса контролом.
как достучаться к тексту который вводиться в поле?
Решение:

Код: Edit.Text:=(Sender As TdxBarEdit).CurText;
Автор: Cryogen2003
Дата сообщения: 12.01.2012 11:56
Добрый день.

Есть TcxTableDBTableView, одно из полей привязано Properties = LookupComboBox, а оно в свое время к какому-то DataSource.
Можно ли легко сделать, чтобы при вставки из буфера обмена в это поле сразу искалось значение в том DataSource? Или же придется все делать руками?
Автор: Baklan_vs
Дата сообщения: 12.01.2012 12:05
Cryogen2003
установи свойство DropDownListStyle в IsFixedList.
У меня на справочнике работает.
Автор: Cryogen2003
Дата сообщения: 12.01.2012 12:07
Baklan_vs
У меня установлено в isEditFixedList, потому что так надо.
Автор: Baklan_vs
Дата сообщения: 12.01.2012 12:21
Cryogen2003
С этим свойством у меня тоже всё работает.
при вставке значения которое есть в списке, всё ок.
Автор: sldaac
Дата сообщения: 12.01.2012 13:07

Цитата:
DBViewRates.ViewData.Expand(false);


Прекрасно работает.

групировки нет, данные из функции, раскрывается только одна запись
Автор: Cryogen2003
Дата сообщения: 12.01.2012 13:25
Baklan_vs
нашел в чем проблема - проблема в лукапе, где есть 2 колонки или больше
Автор: andreybear
Дата сообщения: 13.01.2012 06:34
sldaac

Код: DBViewRates.ViewData.Expand(false);
Автор: sldaac
Дата сообщения: 13.01.2012 09:09

Цитата:
Я не просто так ответил - проверил на своем проекте.
А проход по всем строкам и раскрытие каждой в отдельности не помогает?


Да, спсб. проверил весь код что написано и вспомнил....
ADataController.CollapseDetails;
вот и раскрываться раскрывался и тут-же сворачивался, оставляя только на последней записи раскрытый...

Автор: MagistrAnatol
Дата сообщения: 13.01.2012 10:49
Господа, игрался со стилями для грида, но так и не добился требуемого результата - задача следующая -
всю активную строку надо выделить определенным цветом и чтобы активная ячейка была тоже определенного цвета, отличного от цвета фона и от цвета выделения всей строки - ето реально?
а то выходит только выделить активную строку а цвет активной ячейки равен цвету фона
Автор: Czechoslovak
Дата сообщения: 13.01.2012 11:59
MagistrAnatol

Styles.Selection - Стиль выделенной строки

Событие OnGet ContentStyle

if AFocused then AStyle := cxStyle; Необходимый стиль

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.