Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Событие TDBGridEh(Sender).SelectedIndex

Всем доброго дня !

Прошу Гуру помочь решить(подсказать решение) вопроса.
В файле прописан DBGRIDEH и по двойному щелчку на ячейке грид открывается форма. Мне надо что бы курсор становился в поле компонента на форме с таким же DataFiel как и у ячейки grid.

       if  TDBGridEh(Sender).SelectedIndex=8  
      then
           frm.dtPlanDate.SetFocus;
  
     if frm.ShowModal=mrOk
SelectedIndex прописываю на Create формы. Форма не открывается вообще.Если колонка 9 ... и др. то все работает.
Ответ: Всем,доброго утра !

Вопрос решила :
 
     for i:=0 to frm.ComponentCount-1  do
      begin
            if TDBGridEh(Sender).Columns[i].FieldName = 'data_plan'
            then
              begin
                 frm.ActiveControl := frm.dtPlanDate;
                Break;
              end;...
      



Спасибо всем откликнувшимся.
Вопрос: ListBox. Событие изменения свойства SelectedIndex

Здравствуйте.
Разрабатываю приложение с GUI интерфейсом на C#. Нужно, что бы при выборе первых двух элементов в списке, т.е либо первого, либо второго, в редакторе были цифры. Если выбран первый элемент 0, а если второй 1. Код вроде верен, но не работает. На форме 3 элемента. Список, редактор и кнопка. Помогите пожалуйста разобраться. Вот код form.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace opcodes
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            int ls = listBox1.SelectedIndex;
            if (ls == 0) textBox1.Text = "0";
            if (ls == 1) textBox1.Text = "1";
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Функция не доработана", "Информация", MessageBoxButtons.OK);
        }
    }
}
Заранее благодарен!
Ответ:
Сообщение от jonikster
Я не понял, что с чем она складывает.
Ничего не складывает. Это подписка на событие.
Вопрос: TDBGridEh получить значение суммы колонки или как зафиксировать имя колонки в гриде

Доброе время суток,

есть TDBGridEh
у него в Footers есть уже посчитанное значение суммы по колонке.
Дабы не считать эту сумму второй раз хочу взять её прямо из Footers и использовать.

сначала сделал так:
              nMenge := GD_LB.Columns.FindColumnByName('Column_19_O_ANZ_GESAMT').Footers[0].SumValue;
              nWert :=  GD_LB.Columns.FindColumnByName('Column_24_O_WARENWERT').Footers[0].SumValue;


и всё бы работало если б у этого грида пользователи не меняли порядок колонок с его сохранением и послед восстановлением при старте.
В итоге имя колонки меняется с последующим исключением.
Как зафиксировать имя колонки в гриде или обойти эту проблему по другому?

Спасибо.
Ответ: Mikhail Tchervonenko,

точнее так
    function FindColumnByFieldName(var oGD: TDBGridEh;const sFieldName: String): TColumnEh;
    var
      i: Integer;
    begin
      Result := nil;
      for i := 0 to oGD.Columns.Count-1 do
      begin
        if oGD.Columns.Items[i].FieldName = sFieldName then
        begin
          Result := oGD.Columns.Items[i];
          Exit;
        end;
      end;
    end;
Вопрос: Старые грабли TDbgridEh при фильтрации

Привет все, напомните в чем может быть проблема
Есть грид
TDbgridEh->TDatasource->TQuery
Стандартная фильтрация не подходит , по этому решил немного переделать , но тут же грабли

Если делать так (серверная сортировка)
DbGridEh.StFilter.Local:=false;
DbGridEh.SortLocal:=false;

и при нажатии на фильтр пробовать вывести строку фильтра
procedure Tpdf_form.DBGridEh1ApplyFilter(Sender: TObject);
begin
Memo3.Lines.Add(DBGridEh1.DataSource.DataSet.Filter);
end;

то DBGridEh1.DataSource.DataSet.Filter - пусто! Почему ?

второй вариант , локальная сортировка

DbGridEh.StFilter.Local:=true;
DbGridEh.SortLocal:=true;
если вывести фильтр при вызове левого метода , например так

procedure Tpdf_form.Memo3Click(Sender: TObject);
begin
Memo3.Lines.Add(DBGridEh1.DataSource.DataSet.Filter);
end;

то DBGridEh1.DataSource.DataSet.Filter - выводит результат фильтра!
но как только снова про писать
procedure Tpdf_form.DBGridEh1ApplyFilter(Sender: TObject);
begin
Memo3.Lines.Add(DBGridEh1.DataSource.DataSet.Filter);
end;

то DBGridEh1.DataSource.DataSet.Filter - пусто! Почему ?

Что за ахинея ? Почему при вызове DBGridEh1ApplyFilter в DBGridEh1.DataSource.DataSet.Filter пусто??
Как вытянуть строку фильтра ?
Ответ: и еще , вот так ни схавает (фильтр просто не работает)
 Query1.SQL.Text:='select * from "d:\work test\u_flat.DB" where /*Filter*/  1=1';

а вот так работает
Query1.SQL.Text:='select * from "d:\work test\u_flat.DB" where'+#13#10+'/*Filter*/  1=1'+#13#10;
Вопрос: TDBGrid/ TDBGridEh

Добрый день!
Необходимо обеспечить многострочный вывод данных в ячейки DBGrid. Не заголовка, а любой ячейки, и так, чтобы пользователь мог видеть весь не обрезанный текст.
Я попробовал установить библиотеку EhLib и использовал компонент TDBGridEh. Посмотрев примеры, установив параметр TDBGridEh.dbhFitRowHeightToText в True я не добился желаемого результата. Я что-то не так делаю или TDBGridEh не обладает функциональностью многострочного вывода данных?
Ответ: Dimitry Sibiryakov,

автор
И, кстати, пересчитывать высоту при каждой перерисовке - отстой. Можно
делать это гораздо реже.

Скажите, пожалуйста, как это сделать?
Вопрос: сортировка в TDBGridEh датасет SDAC

как сделать локальную сортировку в TDBGridEh компоненты доступа к данным SDAC, а именно TMSStoredProc.
С ADO чото все работало, с SDAC не получается настроить
Ответ: Zelius,

все пасиб, разобрался, просто в процедуре уже было отсортировано по полю вот у меня и не сортировалось
Вопрос: TComboBox и selectedIndex

в общем надо поймать событие когда меняется выбранный элемент до нажатия выбора.

т.е. когда водишь по списку элементов(не выбирая, просто меняя выбранный элемент), нужно в label отображать какой текущий выбранный элемент.

может кто подскажет где поискать?
Ответ: DarkMaster,

Большое спасибо
Вопрос: Sender as Control

Здравствуйте! Суть проблемы следующая: при изменении текста в textbox, мы получаем имя измененного textbox следующим кодом:
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void AllTB_TextChanged(object sender, EventArgs e)
        {
            CName = null;
            bukva = null;
            for (int i = 0; i < 20; i++)
            {
                RetTBox[i].Text = RetTBox[i].Text.ToUpper();
            }
            if (sender is TextBox)
            {
                var control = (sender as TextBox);
                control.ReadOnly = true;
                CName = control.Name;
                bukva = control.Text;
                control = null;
            }
           //(sender as TextBox).ReadOnly = true;
           //CName = (sender as TextBox).Name;
           //bukva = (sender as TextBox).Text;
        }
После изменения другого textbox, имя textbox почему-то не изменяется, т.е. остается таким же, что и при первом вызове данного события
Что тут не так?
Ответ: Вы в событии TextChanged меняете текст, что вызывает повторный вызов этого события и так бесконечно, как ваш код вообще не крашится?

А вообще имя должно корректное присваиваться если вы не делаете всяких глупостей:
Вопрос: sender родительский контейнер

Как обратиться к родительскому контейнеру через дочерний элемент?
У меня есть в панели два списка с одинаковым событием, но с разными именами:
<StackPanel Orientation="Vertical">
                    <ListBox x:Name="lb1">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Вставить" VerticalAlignment= "Stretch" Click="LBmiPaste_Click"></MenuItem>
                            </ContextMenu>
                        </ListBox.ContextMenu>
                    </ListBox>
                    <ListBox x:Name="lb2">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Вставить" VerticalAlignment= "Stretch" Click="LBmiPaste_Click"></MenuItem>
                            </ContextMenu>
                        </ListBox.ContextMenu>
                    </ListBox>
</StackPanel>

И есть обрабатываемое событие
private void LBmiPaste_Click(object sender, RoutedEventArgs e)
        {
            MenuItem miV = sender as MenuItem;
        }

Как через miV или другим способом обратиться к нужному контролу - lb1 или lb2 в зависимости от того, какой дочерний элемент уго вызвал? Заранее благодарен.
Ответ:
TD6370
Нашел. К контролу ListBox нужно добираться через Parent и PlacementTarget.


        public static T FindVisualParent<T>(DependencyObject element) where T : UIElement
        {
            var parent = element;
            while (parent != null)
            {
                var correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }


метод находит родителя по типу в визуальном дереве (похоже по работе на:
{RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type T}})
Вопрос: Выйти через *Sender на сам компонент.

В любом методе любого компонента билдера первым параметром идет *Sender. Есть ли способ через Sender выйти на объект, к которому этот метод относится? Или хотя бы к его имени. Sender не имеет свойств, одни методы.
Ответ:
TListBox *oListBox = dynamic_cast<TListBox*>(Sender);