【问题标题】:Bind to Combo box based on Data Gridview selection基于 Data Gridview 选择绑定到组合框
【发布时间】:2017-11-29 16:24:19
【问题描述】:

我有这个问题;

int 性别 = int.Parse(row.Cells[0].Value.ToString()); cmbGender.SelectedValue = 性别;

  1. 我使用另一个表中的值的 ID 将值保存到数据库中的另一个表中。
  2. 我想从我的数据库中检索名称而不是值的 ID 并绑定到组合框。组合框已包含数据库中的选项。
  3. 上面的代码为我提供了从我的数据网格视图到组合框中的第一个选择的女性。第二个选择是男性。
  4. 当我移到表格的第三行时,没有选择性别。
  5. 第一个选择也与数据库中的确切记录不对应。 我需要你的帮助

【问题讨论】:

  • 我不确定我是否理解您的问题:如果您使用cmbGender.SelectedValue = gender 而不是cmbGender.SelectedIndex = gender 会发生什么?
  • 这个想法是,一旦我单击 datagridview 中的特定单元格,就可以将数据库中的值(已经传递给我的 datagridview)设置到我的组合框中。 SelectedIndex 没有为我做这件事。我正在使用存储过程来发送和检索我的记录。
  • @IsaacZahn 您可以从您的代码中发布相关部分吗?这个问题很容易回答。
  • private void dtGrdAdd_CellClick(object sender, DataGridViewCellEventArgs e) {if (e.RowIndex >= 0) { DataGridViewRow row = this.dtGrdAdd.Rows[e.RowIndex]; //这部分只获取绑定到组合框的第一个和第二个项目。 //它不会将网格视图中的项目绑定到组合 int gender = int.Parse(row.Cells[0].Value.ToString()); cmbGender.SelectedValue = 性别; } } }

标签: c# winforms


【解决方案1】:

很难帮助您,因为您没有以有组织的方式发布代码的所有相关部分。
我看到您是新来的,请阅读:How do I ask a good question

因为您的问题中缺少部分,所以我会做出一些假设。
请尝试理解我的回答的原则

  1. 我假设您使用Datatable 来从数据库中检索数据。
  2. 我假设列名是“ID”和“Gender”
  3. 我假设 Gender 的值为 0(男性)和 1(“女性”)。
  4. 我假设您的组合框值为“MALE”和“FEMALE”

我建议使用字典来获取每个Cellclick事件中ID的性别

请阅读代码里面的cmets:

private void Form1_Load(object sender, EventArgs e)
{
    GetDataFromDataBase();
}

Dictionary<int, int> IdGenderDict;
private void GetDataFromDataBase()
{
    // get data from database
    DataTable dt = DAL.DataBase.GetData();
    // set datagridview
    dtGrdAdd.DataSource = dt;
    // initilize dictionary that willl hold key value pair for ID against its gender
    IdGenderDict = new Dictionary<int, int>();
    // set the dictionary
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        IdGenderDict.Add(Convert.ToInt32(dt.Rows[i]["ID"].ToString()),
        Convert.ToInt32(dt.Rows[i]["Gender"].ToString()));
    }
}

private void dtGrdAdd_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // get the selected id from the datagridview
    var id = Convert.ToInt32(this.dtGrdAdd.Rows[e.RowIndex].Cells["ID"].ToString());
    // find the gender using the dictionary
    var gender = IdGenderDict[id];
    // set the combobox with the gender
    if (gender == 0)
    {
        cmbGender.SelectedItem = "MALE";
    }
    else
    {
        cmbGender.SelectedItem = "FEMALE";
    }
}

【讨论】:

  • 非常感谢。数据表 dt = DAL.DataBase.GetData(); DAL.database.GetaData() 会做什么。我主要对 DAL 的功能感兴趣
  • DAL 是处理数据库操作的项目的约定名称(它不是系统命名空间),我假设您有一个处理数据库调用的项目 - 如果不是一个好习惯将数据层与业务逻辑和表示层分开,请阅读:msdn.microsoft.com/en-us/library/ee658109.aspx。如果这回答了您的问题,请通过单击复选标记图标将其标记为答案(-:
【解决方案2】:

通过存储过程从数据库: Gender.ID 作为 GenderID, 性别.性别,

INNER JOIN Gender ON Gender.ID = Staff.Gender

在 WinForms 中:

private void dtGrdAdd_CellClick(对象发送者,DataGridViewCellEventArgs e)
{

//获取包含所有行的集合 DataGridViewRow row = this.dtGrdAdd.Rows[e.RowIndex];

// row.Cells[4].Value代表DataGridView上Row的索引
int gender = int.Parse(row.Cells[4].Value.ToString()); cmbGender.SelectedValue = gender;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多