Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Проблемы с bindingsourse


Автор: GUZstav 25.4.2009, 10:51
Доброго времни суток, уважаемые программисты.

Проектирую арм на c#, база microsoft sql server 2005. Раньше писал на delphi + access, прошу не судить строго, потому как пишу первое серьезное приложение на c#.
У меня следующая проблема: есть две формы, на form1 расположен datagridview, который привязан к bindingsourse соответсвующей таблицы, на ней все правильно отображается, на этой форме есть кнопки "добавить", "изменить", удалить запись. НА второй форме лежат textboxы, comboboxы, привязанные к своему bindingsourse.
При нажатии добавить хотелось сделать, что = нить типо этого:

 public void button2_Click(object sender, EventArgs e)
        {
            updatePacient updatePacient1 = new updatePacient(); // это вторая форма

            updatePacient1.Validate;
            updatePacient1.t_kartaBindingSource.AddNew;

            updatePacient1.ShowDialog(this);
          }

И вторая форма открылась бы на новой записи. Вместо этого она открывается на 1й записи. Догадываюсь, что это из=за того, что на каждой форме свой binding sourse и dataset. Бьюсь уже 3 день ничего на ум не приходит.

Что касается кнопки изменить. Хотелось бы сделать так, чтобы с form1 я смог бы прередать bindingsorse1.position на 2 форму bindingsorse2.position:

bindingsorse2.position=bindingsorse1.position и при открытии 2 формы она бы открывалась на той позици которую я выбрал в datagrid 1-й формы.

Я делал аналогичную программу на delphi, там я поступал так: брал номер текущей позиции datagrid на 1 форме, и фильтровал по нему вторую, все работало. Здесь же хотелось бы сделать все грамотно.

Зачем мне это надо: хочу уйти от bindingnavigatora и оставить на нем одну лишь кнопку сохранить. Прогу делаю для людей поэтому борюсь за простоту использования. 

Времени мало, кто знает тыкните пальцем где туплю. Книги читать времени тоже нет. Заранее благодарю..

Автор: -Mikle- 25.4.2009, 12:52
Если я правильно понял, то вторая форма забивает/отображает/изменяет одну строку какой-то таблицы? Если так, то я бы не делал привязку на второй форме. Вместо этого, я бы передавал DataRow (или DataRowView) второй форме. После нажатия ОК на 2-ой форме записывал бы значения в переданную DataRow. Примерно так:
Код

private void AddPacient()
{
    DataTable table = ..... // pacient table
    DataRow row = table.NewRow();
    UpdatePacientForm setPacientDlg = new UpdatePacientForm();
    setPacientDlg.Record = row;
    if(setPacientDlg.ShowDialog(this) == DialogResult.OK)
        table.Rows.Add(row);
}

private void EditPacient()
{
    DataRow row = ... // current row
    UpdatePacientForm setPacientDlg = new UpdatePacientForm();
    setPacientDlg.Record = row;
    setPacientDlg.ShowDialog(this);
}


ИМХО, привязка на 2-ой форме имела бы смысл, если бы она отображала дополнительные сведения, то есть она была бы не модальной и постоянно висела бы, и когда на первой форме выбирали бы запись, то на второй автоматом бы отображалась текущая строка... В твоем случае 2-ая форма это диалог...

Автор: GUZstav 25.4.2009, 13:19
Да ты меня правильно понял. Ты предлогаешь создать переменную row типа 


Цитата(-Mikle- @  25.4.2009,  12:52 Найти цитируемый пост)
setPacientDlg.Record = row;


но откуда у формы поле типа record

можно здесь подробнее...

а затем присваивать row. имя поля = "......... " и так для каждого, не проще тогда воспользовать insert.

А в метоле formactivate писать
{
         textbox1.text=row. имя поля// для просмотра
}

Добавлено через 10 минут и 46 секунд
Цитата(-Mikle- @  25.4.2009,  12:52 Найти цитируемый пост)
привязка на 2-ой форме имела бы смысл, если бы она отображала дополнительные сведения

к основной таблице привязаны справочники, которые отбражают значения в combobox

Автор: GUZstav 25.4.2009, 14:55
ну есть же функция bindingsourse.addnew. как ее вызвать с form1 для updatePacient? и как передать bindingsourse.position для грида на form1 в bindingsourse.position формы updatePacient, чтобы bindingsourse сам выставил данные нужного человека? зачем изобретать велосипед если уже есть встроенные функции?

Автор: -Mikle- 25.4.2009, 15:17
Ну ок. Тогда сделай BindingSource 2-ой формы Public (в дизайнере(!) есть такое свойство Modifiers)
После этого, BindingSource будет доступен извне:

updatePacient.t_kartaBindingSource...........

Что делать дальше, думаю уже понятно. ((или нет?))

Автор: GUZstav 26.4.2009, 17:20
спасибо, догнал, теперь проблема такая
Код

        public void button2_Click(object sender, EventArgs e)
        {
            updatePacient updatePacientDlg = new updatePacient();
            updatePacientDlg.t_kartaTableAdapter.Fill(updatePacientDlg.dataSet1.T_karta);
            
            updatePacientDlg.t_kartaBindingSource.AddNew();
            updatePacientDlg.t_kartaBindingSource.MoveLast();
            
        
            updatePacientDlg.ShowDialog(this);


новая запись о человеке добавляется, но на него не переходит, т.е movelast не работает. Подскажите, может надо както обновить

Автор: GUZstav 26.4.2009, 17:50
всем спасибо дошло. movelast не работал, т.к были куски кода в форм активэйт, мой тупняк smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)