如果更改组合框值,则更改文本框值 (System.FormatException: 'Input string was not in a correct format.')
Change textbox value if change combobox value (System.FormatException: 'Input string was not in a correct format.')
如果我更改组合框索引,我将尝试自动加载文本框值
但不明白如果我加载我的表单我收到这个错误?
我处理我的 null,如果我忽略这一行,一切都很好!
这是我的表格
这是我的存储库
区域资源库
public string GetAreaNamebyAreaID(int areaID)
{
var result = db.btbArea.SingleOrDefault(g => g.AreaID == areaID);
if (result == null)
return string.Empty;
return result.AreaName;
}
HowzehRepository
public string GetHowzehNamebyHoezehID(int howzehID)
{
var result = db.btbHowzeh.SingleOrDefault(g => g.HowzehID == howzehID);
if (result == null)
return string.Empty;
return result.HowzehName;
}
Paygah存储库
public string GetPaygahNamebyPaygahID(int paygahID)
{
var result = db.btbPaygah.SingleOrDefault(g => g.PaygahID == paygahID);
if (result == null)
return string.Empty;
return result.PaygahName;
}
如果我更改我的组合框索引,我将尝试加载我的文本框值
private void frmAreasManage_Load(object sender, EventArgs e)
{
//Load AreaComboBox Source from AreaTable
using (UnitOfWork db = new UnitOfWork())
{
cmbAreaNumber.DataSource = db.AreaRepository.Get();
cmbAreaNumber.DisplayMember = "AreaNumber";
cmbAreaNumber.ValueMember = "AreaID";
}
}
private void cmbAreaNumber_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedValue = cmbAreaNumber.SelectedValue.ToString();
using (UnitOfWork db = new UnitOfWork())
if (!string.IsNullOrEmpty(selectedValue))
{
{
//Load HowzehhComboBox From HowzehTable Filter By AreaID
cmbHowzehNumber.DataSource = db.HowzehRepository.GetNameIDByFilter(selectedValue);
cmbHowzehNumber.DisplayMember = "HowzehNumber";
cmbHowzehNumber.ValueMember = "HowzehID";
//Get AreaName from AreaTable Filter By AreaID
txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(Convert.ToInt32(selectedValue));
}
}
}
private void cmbHowzehNumber_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedValue = cmbHowzehNumber.SelectedValue.ToString();
using (UnitOfWork db = new UnitOfWork())
if (!string.IsNullOrEmpty(selectedValue))
{
//Load PaygahComboBox From PaygahTable Filter By HowzehID
cmbPaygahNumber.DataSource = db.PaygahRepository.GetNameIDByFilter(selectedValue);
cmbPaygahNumber.DisplayMember = "PaygahNumber";
cmbPaygahNumber.ValueMember = "PaygahID";
//Get HowzehName from HowzehTable Filter By HowzehID
txtHowzehName.Text = db.HowzehRepository.GetHowzehNamebyHoezehID(Convert.ToInt32(selectedValue));
}
}
private void cmbPaygahNumber_SelectedIndexChanged(object sender, EventArgs e)
{
using (UnitOfWork db = new UnitOfWork())
{
//Get HowzehName from HowzehTable Filter By HowzehID
txtPaygahName.Text = db.PaygahRepository.GetPaygahNamebyPaygahID(Convert.ToInt32(selectedValue));
}
}
TL;DR
要解决您的问题,请对方法进行下一步更改 frmAreasManage_Load
:
private void frmAreasManage_Load(object sender, EventArgs e)
{
//Load AreaComboBox Source from AreaTable
using (UnitOfWork db = new UnitOfWork())
{
// At first assign properties DisplayMember and ValueMember.
cmbAreaNumber.DisplayMember = "AreaNumber";
cmbAreaNumber.ValueMember = "AreaID";
// And then assign DataSource property of the cmbAreaNumber.
cmbAreaNumber.DataSource = db.AreaRepository.Get();
}
}
说明
为什么要在DataSource
之前赋值ValueMember
属性?
当我们分配 DataSource
属性 时,分配集合的第一项变为 ComboBox
的 SelectedValue
。这会触发 ComboBox.SelectedIndexChanged
事件。
如果我们在 ValueMember
之前分配 DataSource
(因此 ValueMember = null
),那么 CombobBox.SelectedValue
就是集合本身的第一项。在你的例子中 SelectedValue
是一个 btbArea
类型的对象。因此,当我要求您使用 cmbAreaNumber_SelectedIndexChanged
处理程序中的下一个代码时
txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(((btbArea) cmbAreaNumber.SelectedValue).AreaID);
它解决了第一次加载的问题。但是后来你得到了System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'Gim.DataLayer.btbArea'
。发生此错误是因为 ValueMember
属性 被分配给值 AreaID
并且从那一刻起 ComboBox.SelectedValue
是 属性 int AreaID
的值btbArea
.
如果我们分配 ValueMember = "AreaID"
,然后分配 DataSource
,那么每当引发 ComboBox.SelectedIndexChanged
事件时,SelectedValue
就是 属性 [=28= 的值].因此,为了防止 SelectedValue
成为 btbArea
类型的对象(当 ValueMember = null
时的情况),我们必须首先分配 ValueMember
然后 DataSource
.
如果我更改组合框索引,我将尝试自动加载文本框值 但不明白如果我加载我的表单我收到这个错误?
我处理我的 null,如果我忽略这一行,一切都很好!
这是我的表格
这是我的存储库
区域资源库
public string GetAreaNamebyAreaID(int areaID)
{
var result = db.btbArea.SingleOrDefault(g => g.AreaID == areaID);
if (result == null)
return string.Empty;
return result.AreaName;
}
HowzehRepository
public string GetHowzehNamebyHoezehID(int howzehID)
{
var result = db.btbHowzeh.SingleOrDefault(g => g.HowzehID == howzehID);
if (result == null)
return string.Empty;
return result.HowzehName;
}
Paygah存储库
public string GetPaygahNamebyPaygahID(int paygahID)
{
var result = db.btbPaygah.SingleOrDefault(g => g.PaygahID == paygahID);
if (result == null)
return string.Empty;
return result.PaygahName;
}
如果我更改我的组合框索引,我将尝试加载我的文本框值
private void frmAreasManage_Load(object sender, EventArgs e)
{
//Load AreaComboBox Source from AreaTable
using (UnitOfWork db = new UnitOfWork())
{
cmbAreaNumber.DataSource = db.AreaRepository.Get();
cmbAreaNumber.DisplayMember = "AreaNumber";
cmbAreaNumber.ValueMember = "AreaID";
}
}
private void cmbAreaNumber_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedValue = cmbAreaNumber.SelectedValue.ToString();
using (UnitOfWork db = new UnitOfWork())
if (!string.IsNullOrEmpty(selectedValue))
{
{
//Load HowzehhComboBox From HowzehTable Filter By AreaID
cmbHowzehNumber.DataSource = db.HowzehRepository.GetNameIDByFilter(selectedValue);
cmbHowzehNumber.DisplayMember = "HowzehNumber";
cmbHowzehNumber.ValueMember = "HowzehID";
//Get AreaName from AreaTable Filter By AreaID
txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(Convert.ToInt32(selectedValue));
}
}
}
private void cmbHowzehNumber_SelectedIndexChanged(object sender, EventArgs e)
{
string selectedValue = cmbHowzehNumber.SelectedValue.ToString();
using (UnitOfWork db = new UnitOfWork())
if (!string.IsNullOrEmpty(selectedValue))
{
//Load PaygahComboBox From PaygahTable Filter By HowzehID
cmbPaygahNumber.DataSource = db.PaygahRepository.GetNameIDByFilter(selectedValue);
cmbPaygahNumber.DisplayMember = "PaygahNumber";
cmbPaygahNumber.ValueMember = "PaygahID";
//Get HowzehName from HowzehTable Filter By HowzehID
txtHowzehName.Text = db.HowzehRepository.GetHowzehNamebyHoezehID(Convert.ToInt32(selectedValue));
}
}
private void cmbPaygahNumber_SelectedIndexChanged(object sender, EventArgs e)
{
using (UnitOfWork db = new UnitOfWork())
{
//Get HowzehName from HowzehTable Filter By HowzehID
txtPaygahName.Text = db.PaygahRepository.GetPaygahNamebyPaygahID(Convert.ToInt32(selectedValue));
}
}
TL;DR
要解决您的问题,请对方法进行下一步更改 frmAreasManage_Load
:
private void frmAreasManage_Load(object sender, EventArgs e)
{
//Load AreaComboBox Source from AreaTable
using (UnitOfWork db = new UnitOfWork())
{
// At first assign properties DisplayMember and ValueMember.
cmbAreaNumber.DisplayMember = "AreaNumber";
cmbAreaNumber.ValueMember = "AreaID";
// And then assign DataSource property of the cmbAreaNumber.
cmbAreaNumber.DataSource = db.AreaRepository.Get();
}
}
说明
为什么要在DataSource
之前赋值ValueMember
属性?
当我们分配 DataSource
属性 时,分配集合的第一项变为 ComboBox
的 SelectedValue
。这会触发 ComboBox.SelectedIndexChanged
事件。
如果我们在 ValueMember
之前分配 DataSource
(因此 ValueMember = null
),那么 CombobBox.SelectedValue
就是集合本身的第一项。在你的例子中 SelectedValue
是一个 btbArea
类型的对象。因此,当我要求您使用 cmbAreaNumber_SelectedIndexChanged
处理程序中的下一个代码时
txtAreaName.Text = db.AreaRepository.GetAreaNamebyAreaID(((btbArea) cmbAreaNumber.SelectedValue).AreaID);
它解决了第一次加载的问题。但是后来你得到了System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'Gim.DataLayer.btbArea'
。发生此错误是因为 ValueMember
属性 被分配给值 AreaID
并且从那一刻起 ComboBox.SelectedValue
是 属性 int AreaID
的值btbArea
.
如果我们分配 ValueMember = "AreaID"
,然后分配 DataSource
,那么每当引发 ComboBox.SelectedIndexChanged
事件时,SelectedValue
就是 属性 [=28= 的值].因此,为了防止 SelectedValue
成为 btbArea
类型的对象(当 ValueMember = null
时的情况),我们必须首先分配 ValueMember
然后 DataSource
.