[英]System.FormatException: Input string was not in a correct format. c#
[英]Change textbox value if change combobox value (System.FormatException: 'Input string was not in a correct format.')
如果我更改我的 combobox 索引,我會嘗試自動加載文本框值,但不明白如果我加載我的表單會收到此錯誤?
我處理我的 null,如果我忽略這一行,一切都很好!
這是我的表格
這是我的存儲庫
區域庫
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;
}
如果我更改 combobox 索引,我將嘗試加載我的文本框值
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();
}
}
為什么我們需要在DataSource
屬性之前分配ValueMember
?
當我們分配DataSource
屬性時,分配集合的第一項變為ComboBox
的SelectedValue
。 這會觸發ComboBox.SelectedIndexChanged
事件。
如果我們在ValueMember
之前分配DataSource
(因此ValueMember = null
),則CombobBox.SelectedValue
是集合本身的第一項。 在您的情況下, SelectedValue
是 object 類型的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
是 btbArea 的屬性int AreaID
btbArea
。
如果我們分配ValueMember = "AreaID"
,然后分配DataSource
,那么只要ComboBox.SelectedIndexChanged
事件, SelectedValue
就是屬性AreaID
的值。 因此,為了防止SelectedValue
成為 btbArea 類型的btbArea
(當ValueMember = null
時的情況),我們必須首先分配ValueMember
,然后分配DataSource
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.