如果我更改组合框索引,我将尝试自动加载文本框值但不明白我是否加载表格会收到此错误?
我处理我的null,如果我忽略此行,一切都很好!
这是我的表格
这是我的存储库
AreaRepository
public string GetAreaNamebyAreaID(int areaID)
{
var result = db.btbArea.SingleOrDefault(g => g.AreaID == areaID);
if (result == null)
return string.Empty;
return result.AreaName;
}
Howzeh存储库
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));
}
}
}
要解决您的问题,请在方法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();
}
}
为什么我们需要在ValueMember
属性之前分配DataSource
?
[当我们分配DataSource
属性时,分配的集合的第一项成为SelectedValue
的ComboBox
。这会触发ComboBox.SelectedIndexChanged
事件。
如果我们在DataSource
之前(因此ValueMember
)分配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
的值(不是btbArea
类型的对象本身)。
如果先分配ValueMember = "AreaID"
,然后分配DataSource
,则每当引发ComboBox.SelectedIndexChanged
事件时,SelectedValue
是属性AreaID
的值。因此,我们必须首先分配ValueMember
,然后分配DataSource
(以防止SelectedValue
成为btbArea
类型的对象)。