3

私はwinformで作業しており、コンボボックスを使用しています。

この順序でコンボボックスのプロパティを設定します

combobox.DisplayMember 
combobox.ValueMember 
combobox.DataSource 

バインディングコードは

   private void BindBranch()
    {
        BranchClass branch = new BranchClass();
        branch.Active = true;
        branch.Company = Startup.CompID;
        if (branch.GetAll(out dtBranch, out result))
        {
            cmbBranch.DisplayMember = "br_name";
            cmbBranch.ValueMember = "br_id";
            cmbBranch.DataSource = dtBranch;
        }
        else
        {
            MessageBox.Show(result);
        }
    }

アプリケーションでコンボボックスを数回使用しましたが、どこで間違いを犯しているのかわかりません。

SelectedItemプロパティは、「ValueMember」プロパティのデータ型に基づいて正確な値(int、string)を返す場合がありますが、「DataRowView」を返す場合もあります。その場合、InvalidCastExceptionがスローされます。

これは、コンボボックスでプロパティが設定されている順序が原因であると読みました。しかし、今はそうではありません。

バインディングコードは

ここに画像の説明を入力してください

発信コードは

private void BindEmployee() 
{
    employee.Branch = Convert.ToInt32(cmbBranch.SelectedItem); // InvalidCastException thrown here
    employee.Active = true;

    var dt = new DataTable();
    if (employee.GetEmployee(out dt, out result, false))
    {
        cmbEmployee.DisplayMember = "emp_name";
        cmbEmployee.ValueMember = "emp_id";
        cmbEmployee.DataSource = dt;
    }
}
4

4 に答える 4

0

これは、選択したDataRowViewをComboBoxから取得する方法です。

データバインディングを使用してコンボボックスにデータを入力したため。その場合は、コンボボックスのSelectedItemプロパティを使用します。おそらくDataRowViewが含まれているので、このようなコードを使用できます。

DataRowView viewRow = (DataRowView)cmbBranch.SelectedItem;
DataRow row = viewRow.Row;
于 2012-12-01T10:45:40.347 に答える
0

回避策は、以下のようにcmbBranch.SelectedItemによって返されるタイプを確認することです。

object item = cmbBranch.SelectedItem;
int branchId;
if (item is int)
   branchId = item as int;
else if (item is DataRowView)
   branchId = Convert.ToInt32(((DataRowView)item)["BR_ID"].ToString());

これが効率的な解決策であるかどうかはわかりませんが、回避策になる可能性があります。

于 2012-12-01T11:05:39.497 に答える
0

私はあなたが後だと思いますbr_id。やってみました:

employeeBranch = ConvertToInt32(cmBranch.SelectedValue);
于 2012-12-01T11:18:13.003 に答える
0

の代わりにbr_id使用したい場合。SelectedValueSelectedItem

int id = (int)cmBranch.SelectedValue;

SelectedValueで指定されたプロパティの値を返しますValueMemberSelectedItem常にデータ行を返す必要があります。

于 2012-12-04T17:04:24.630 に答える