Выбранное значение в выпадающем списке после двойного щелчка - PullRequest
0 голосов
/ 13 мая 2018

У меня есть сетка данных со значениями из 2 таблиц.

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

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

Но мне нужно, чтобы этот ComboBox получал Выбранное значение из таблицы данных, но он всегда поворачивает первое значение из списка.

Вот мой код для события двойного ckick в просмотре данных.

Может кто-нибудь помочь мне сделать эту работу?

Это проект Windows Forms.

public System.Data.DataTable ContratosTable { get; set; }

    public void LoadContratosTable()
    {
        ContratosTable = new System.Data.DataTable();
        using (var cn = new SqlConnection { ConnectionString = ConfigurationManager.ConnectionStrings["IWMConnectionString"].ConnectionString.ToString() })
        {
            using (var cmd = new SqlCommand { Connection = cn })
            {
                cn.Open();
                cmd.CommandText = "SELECT IdContrato, Designacao FROM dbo.Contratos";
                ContratosTable.Load(cmd.ExecuteReader());
            }
        }
    }

    private void concelhos_datagrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        BindingSource bs = new BindingSource();
        LoadContratosTable();
        bs.DataSource = ContratosTable;
        Concelhos_Edit f = new Concelhos_Edit();
        f.txt_id.Text = concelhos_datagrid.CurrentRow.Cells[0].Value.ToString();
        var _nomeContrato = ContratosTable.AsEnumerable().FirstOrDefault(a => a.Field<int>("IdContrato") == ((DataRowView)bs.Current).Row.Field<int>("IdContrato")).Field<string>("Designacao");
        var pos = f.cmb_contrato.FindString(_nomeContrato);
        if (pos > -1)
        {
            f.cmb_contrato.SelectedIndex = pos;
        }
        f.txt_sigla.Text = concelhos_datagrid.CurrentRow.Cells[2].Value.ToString();
        f.txt_nome.Text = concelhos_datagrid.CurrentRow.Cells[3].Value.ToString();
        f.txt_codigo.Text = concelhos_datagrid.CurrentRow.Cells[4].Value.ToString();
        f.txt_qservico.Text = concelhos_datagrid.CurrentRow.Cells[5].Value.ToString();
        f.chk_ativo.Checked = (bool)concelhos_datagrid.CurrentRow.Cells[6].Value;
        f.MdiParent = this.MdiParent;
        f.Show();
    }

1 Ответ

0 голосов
/ 13 мая 2018

Это укажет и поможет вам в правильном направлении.Попробуйте следовать за MVC или MVVM, и дизайн поможет вам разделить проблемы, и в итоге вы получите более качественный и чистый код.

На данный момент создайте класс, как показано ниже:

public class Info
{
    public Info()
    {
        this.NomeContrato = new List<string>();
    }
    public string Id { get; set; }
    public string Sigla { get; set; }
    public string Nome { get; set; }
    public string Codigo { get; set; }
    public string QServico { get; set; }
    public bool Ativo { get; set; }
    public List<string> NomeContrato { get; set; }
}

Затем добавьте это свойство в класс Concelhos_Edit:

public Info Model { get; set; }

Также добавьте этот код в обработчик _Load формы Concelhos_Edit:

this.cmb_contrato.DataSource = this.Model.NomeContrato;
// If you need the SelectedValue from the other form, then add another 
// property to Info class and put the value there.
// this.cmb_contrato.SelectedValue = this.Model.SelectedValue;
this.cmb_contrato.SelectedValue = "whatever you want to be selected";

Затем изменитеметод двойного щелчка в ячейке с именем: concelhos_datagrid_CellDoubleClick выглядит следующим образом:

private void concelhos_datagrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
    // Your code...
    var editForm = new Concelhos_Edit();
    var editFormModel = new Info();
    editFormModel.Id = f.txt_id.Text = concelhos_datagrid.CurrentRow.Cells[0].Value.ToString();
    // Set other properties

    // Here is the work for dropdown
    var _nomeContrato = ContratosTable.AsEnumerable().FirstOrDefault(a => a.Field<int>("IdContrato") == ((DataRowView)bs.Current).Row.Field<int>("IdContrato")).Field<string>("Designacao");

    editFormModel.NomeContrato.AddRange(_nomeContrato);

    formEdit.Model = editFormModel;
    formEdit.MdiParent = this.MdiParent;
    formEdit.Show();
}

Пожалуйста, используйте этот код в качестве руководства, и вам может понадобиться настроить его.Идея состоит в том, чтобы передать информацию, в которой нуждается форма, и затем позволить этой форме делать что-либо с информацией: хочет ли она отображать информацию в TextBox или RadioButton - это бизнес этой формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...