双击datagridview后,Combobox中的SelectedValue

问题描述 投票:0回答:1

我有一个datagridview,它有2个表的值。

当我双击一行时,我需要将这些值传递给另一个表单。该表单包含文本框和一个Combobox,其中包含表中的值,这些值为我提供了所有需要选择的值。

对于文本框,没有问题,但对于组合框,这是一个真正的痛苦。

但我需要这个ComboBox从datagridview获取Selected Value,但它总是从列表中转换第一个值。

这是我在datagridview中双击事件的代码。

请有人帮我做这个工作吗?

这是一个Windows窗体项目。

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();
    }
c# datagridview combobox
1个回答
0
投票

这将指出并帮助您朝着正确的方向前进。尝试并遵循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();
}

请使用此代码作为指南,您可能需要进行调整。我们的想法是传递表单所需的信息,然后让表单对信息做任何事情:是否要在TextBoxRadioButton中显示信息是该形式的业务。

© www.soinside.com 2019 - 2024. All rights reserved.