如果更改组合框值,则更改文本框值(System.FormatException:'输入字符串的格式不正确。')

问题描述 投票:0回答:1

如果我更改组合框索引,我将尝试自动加载文本框值但不明白我是否加载表格会收到此错误?

enter image description here

我处理我的null,如果我忽略此行,一切都很好!

这是我的表格


enter image description here

这是我的存储库

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));
        }
    }
}
c# entity-framework linq combobox textbox
1个回答
0
投票

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();
    }
}

说明

为什么我们需要在ValueMember属性之前分配DataSource

[当我们分配DataSource属性时,分配的集合的第一项成为SelectedValueComboBox。这会触发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.SelectedValueint AreaID的属性btbArea的值(不是btbArea类型的对象本身)。

如果先分配ValueMember = "AreaID",然后分配DataSource,则每当引发ComboBox.SelectedIndexChanged事件时,SelectedValue是属性AreaID的值。因此,我们必须首先分配ValueMember,然后分配DataSource(以防止SelectedValue成为btbArea类型的对象)。

© www.soinside.com 2019 - 2024. All rights reserved.