簡體   English   中英

如果更改 combobox 值,則更改文本框值(System.FormatException:“輸入字符串的格式不正確。”)

[英]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屬性時,分配集合的第一項變為ComboBoxSelectedValue 這會觸發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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM