如果更改组合框值,则更改文本框值 (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 属性 时,分配集合的第一项变为 ComboBoxSelectedValue。这会触发 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.