C# 如何将数据源重新绑定到winform DataGridView组合框列?
我在winform中有一个DataGridView,它有两个组合框列:1)公司,2)帐户。 我想根据所选公司更新帐户组合框。 我有以下代码:C# 如何将数据源重新绑定到winform DataGridView组合框列?,c#,winforms,datagridview,combobox,C#,Winforms,Datagridview,Combobox,我在winform中有一个DataGridView,它有两个组合框列:1)公司,2)帐户。 我想根据所选公司更新帐户组合框。 我有以下代码: void recipientsDataGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { try { ComboBox cb = e.Control as Combo
void recipientsDataGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
try
{
ComboBox cb = e.Control as ComboBox;
if (cb != null)
{
cb.SelectedValueChanged -= new EventHandler(companyCombobox_SelectedValueChanged);
cb.SelectedValueChanged += new EventHandler(companyCombobox_SelectedValueChanged);
}
}
catch (Exception ex)
{
}
}
private void companyCombobox_SelectedValueChanged(object sender, EventArgs e)
{
try
{
var currentCell = recipientsDataGrid.CurrentCellAddress;
if (currentCell.X == 3)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
int companyId = sendingCB.SelectedValue.ToInt();
DataTable dtAccounts = m_CustomersFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell cboAccounts = (DataGridViewComboBoxCell)recipientsDataGrid.Rows[currentCell.Y].Cells["Account"];
cboAccounts.ValueMember = "account_id";
cboAccounts.DisplayMember = "AccountName";
cboAccounts.DataSource = dtAccounts;
int defaultAccountId = (from row in dtAccounts.AsEnumerable()
where row.Field<string>("AccountName").EndsWith("*")
select row.Field<int>("account_id")).FirstOrDefault();
if (defaultAccountId > 0)
cboAccounts.Value = defaultAccountId;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void recipientsDataGrid\u EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e)
{
尝试
{
组合框cb=e。控件作为组合框;
如果(cb!=null)
{
cb.SelectedValueChanged-=新事件处理程序(companyCombobox\U SelectedValueChanged);
cb.SelectedValueChanged+=新事件处理程序(companyCombobox\U SelectedValueChanged);
}
}
捕获(例外情况除外)
{
}
}
私有无效公司邮箱\所选值已更改(对象发送方,事件参数e)
{
尝试
{
var currentCell=recipientsDataGrid.CurrentCellAddress;
如果(currentCell.X==3)
{
var sendingCB=作为DataGridViewComboBoxEditingControl的发送方;
int companyId=sendingCB.SelectedValue.ToInt();
DataTable dtAccounts=m_CustomerFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell CBOAAccounts=(DataGridViewComboxCell)recipientsDataGrid.Rows[currentCell.Y]。单元格[“Account”];
cboAccounts.ValueMember=“账户id”;
cboAccounts.DisplayMember=“AccountName”;
cboAccounts.DataSource=dtAccounts;
int defaultAccountId=(来自dtAccounts.AsEnumerable()中的行)
其中row.Field(“AccountName”).EndsWith(“*”)
选择row.Field(“帐户id”).FirstOrDefault();
如果(defaultAccountId>0)
cboAccounts.Value=defaultAccountId;
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
在我第一次选择公司时,它工作正常,但当我更改公司并尝试更新帐户组合框的数据源时,我收到一个错误:
我试图手动添加项目,而不是使用数据源,但我得到了相同的错误。
我怎样才能修好它?
请…在重新绑定之前,尝试清除accounts单元格的值,如下所示:
private void companyCombobox_SelectedValueChanged(object sender, EventArgs e)
{
try
{
var currentCell = recipientsDataGrid.CurrentCellAddress;
if (currentCell.X == 3)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
int companyId = sendingCB.SelectedValue.ToInt();
DataTable dtAccounts = m_CustomersFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell cboAccounts = (DataGridViewComboBoxCell)recipientsDataGrid.Rows[currentCell.Y].Cells["Account"];
cboAccounts.Value = null; //Add this code
cboAccounts.ValueMember = "account_id";
cboAccounts.DisplayMember = "AccountName";
cboAccounts.DataSource = dtAccounts;
int defaultAccountId = (from row in dtAccounts.AsEnumerable()
where row.Field<string>("AccountName").EndsWith("*")
select row.Field<int>("account_id")).FirstOrDefault();
if (defaultAccountId > 0)
cboAccounts.Value = defaultAccountId;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void companyCombobox\u SelectedValueChanged(对象发送方,事件参数e)
{
尝试
{
var currentCell=recipientsDataGrid.CurrentCellAddress;
如果(currentCell.X==3)
{
var sendingCB=作为DataGridViewComboBoxEditingControl的发送方;
int companyId=sendingCB.SelectedValue.ToInt();
DataTable dtAccounts=m_CustomerFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell CBOAAccounts=(DataGridViewComboxCell)recipientsDataGrid.Rows[currentCell.Y]。单元格[“Account”];
cboAccounts.Value=null;//添加此代码
cboAccounts.ValueMember=“账户id”;
cboAccounts.DisplayMember=“AccountName”;
cboAccounts.DataSource=dtAccounts;
int defaultAccountId=(来自dtAccounts.AsEnumerable()中的行)
其中row.Field(“AccountName”).EndsWith(“*”)
选择row.Field(“帐户id”).FirstOrDefault();
如果(defaultAccountId>0)
cboAccounts.Value=defaultAccountId;
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
尝试在重新绑定accounts单元格之前清除其值,如下所示:
private void companyCombobox_SelectedValueChanged(object sender, EventArgs e)
{
try
{
var currentCell = recipientsDataGrid.CurrentCellAddress;
if (currentCell.X == 3)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
int companyId = sendingCB.SelectedValue.ToInt();
DataTable dtAccounts = m_CustomersFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell cboAccounts = (DataGridViewComboBoxCell)recipientsDataGrid.Rows[currentCell.Y].Cells["Account"];
cboAccounts.Value = null; //Add this code
cboAccounts.ValueMember = "account_id";
cboAccounts.DisplayMember = "AccountName";
cboAccounts.DataSource = dtAccounts;
int defaultAccountId = (from row in dtAccounts.AsEnumerable()
where row.Field<string>("AccountName").EndsWith("*")
select row.Field<int>("account_id")).FirstOrDefault();
if (defaultAccountId > 0)
cboAccounts.Value = defaultAccountId;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void companyCombobox\u SelectedValueChanged(对象发送方,事件参数e)
{
尝试
{
var currentCell=recipientsDataGrid.CurrentCellAddress;
如果(currentCell.X==3)
{
var sendingCB=作为DataGridViewComboBoxEditingControl的发送方;
int companyId=sendingCB.SelectedValue.ToInt();
DataTable dtAccounts=m_CustomerFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell CBOAAccounts=(DataGridViewComboxCell)recipientsDataGrid.Rows[currentCell.Y]。单元格[“Account”];
cboAccounts.Value=null;//添加此代码
cboAccounts.ValueMember=“账户id”;
cboAccounts.DisplayMember=“AccountName”;
cboAccounts.DataSource=dtAccounts;
int defaultAccountId=(来自dtAccounts.AsEnumerable()中的行)
其中row.Field(“AccountName”).EndsWith(“*”)
选择row.Field(“帐户id”).FirstOrDefault();
如果(defaultAccountId>0)
cboAccounts.Value=defaultAccountId;
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
尝试在重新绑定accounts单元格之前清除其值,如下所示:
private void companyCombobox_SelectedValueChanged(object sender, EventArgs e)
{
try
{
var currentCell = recipientsDataGrid.CurrentCellAddress;
if (currentCell.X == 3)
{
var sendingCB = sender as DataGridViewComboBoxEditingControl;
int companyId = sendingCB.SelectedValue.ToInt();
DataTable dtAccounts = m_CustomersFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell cboAccounts = (DataGridViewComboBoxCell)recipientsDataGrid.Rows[currentCell.Y].Cells["Account"];
cboAccounts.Value = null; //Add this code
cboAccounts.ValueMember = "account_id";
cboAccounts.DisplayMember = "AccountName";
cboAccounts.DataSource = dtAccounts;
int defaultAccountId = (from row in dtAccounts.AsEnumerable()
where row.Field<string>("AccountName").EndsWith("*")
select row.Field<int>("account_id")).FirstOrDefault();
if (defaultAccountId > 0)
cboAccounts.Value = defaultAccountId;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void companyCombobox\u SelectedValueChanged(对象发送方,事件参数e)
{
尝试
{
var currentCell=recipientsDataGrid.CurrentCellAddress;
如果(currentCell.X==3)
{
var sendingCB=作为DataGridViewComboBoxEditingControl的发送方;
int companyId=sendingCB.SelectedValue.ToInt();
DataTable dtAccounts=m_CustomerFunctions.GetCompanyAccounts(companyId);
DataGridViewComboBoxCell CBOAAccounts=(DataGridViewComboxCell)recipientsDataGrid.Rows[currentCell.Y]。单元格[“Account”];
cboAccounts.Value=null;//添加此代码
cboAccounts.ValueMember=“账户id”;
cboAccounts.DisplayMember=“AccountName”;
cboAccounts.DataSource=dtAccounts;
int defaultAccountId=(来自dtAccounts.AsEnumerable()中的行)
其中row.Field(“AccountName”).EndsWith(“*”)
选择row.Field(“帐户id”).FirstOrDefault();
如果(defaultAccountId>