C# 是什么导致ComboBox显示'System.Data.DataRowView'`

C# 是什么导致ComboBox显示'System.Data.DataRowView'`,c#,winforms,datatable,combobox,C#,Winforms,Datatable,Combobox,好的,这个有点奇怪 我有一个非常简单的数据表: 此控件显示等于、小于等 然而,在我的表单中,我有另一个动态创建的组合框,根据TableLayoutPanel中的哪一行给出一个动态名称,等等。 当我对其使用完全相同的代码时,它会为每个下拉选择显示System.Data.DataRowView: 所以,与其让我一行一行地检查代码并尝试对其进行反向工程,有人能告诉我是什么导致了这种情况的发生吗?是否有某种可预测且可重复的方式导致这种行为?我尝试了以下所有方法来扭转它,但没有任何效果: dtecComb

好的,这个有点奇怪

我有一个非常简单的数据表:

此控件显示等于、小于等

然而,在我的表单中,我有另一个动态创建的组合框,根据TableLayoutPanel中的哪一行给出一个动态名称,等等。 当我对其使用完全相同的代码时,它会为每个下拉选择显示System.Data.DataRowView:

所以,与其让我一行一行地检查代码并尝试对其进行反向工程,有人能告诉我是什么导致了这种情况的发生吗?是否有某种可预测且可重复的方式导致这种行为?我尝试了以下所有方法来扭转它,但没有任何效果:

dtecComboAction.DataSource = null;
dtecComboAction.DataBindings.Clear();
dtecComboAction.Items.Clear();
dtecComboAction.BindingContext = this.BindingContext;
我确信我在代码的其他地方做了一些明显的事情,但我无法理解


谢谢

问题中描述的意外行为由OwnerDrawn ComboBox(从ComboBox派生的自定义控件)的自定义绘图确定

当ListControl的数据源是一个复杂对象时(如本例中的a),列表中的每个项本身就是一个复杂对象,这里是

因此,当绘制覆盖OnDrawItem方法的OwnerDrawn ListControl的项时,应使用ListControl的方法获取显示在控件可见区域中的项的文本

如果定义了数据源,则此方法使用内部数据管理器获取项的文本;如果未定义数据源,则使用TypeDescriptor获取项的文本,无论项的类型是什么:

如果未指定DisplayMember属性,则返回 GetItemTextObject是项的ToString方法的值。 否则,该方法将返回指定成员的字符串值 在项中指定的对象的DisplayMember属性中 参数

绘制项目的文本并将其转换为项目对象的字符串时出现的一个典型错误: 如果项的文本是简单字符串,而不是复杂对象,则可以使用此选项。在本例中,[ComplexObject].ToString在本例中返回对象的数据类型System.data.DataRowView

protected override void OnDrawItem(DrawItemEventArgs e)
{
    // (...)
    e.DrawBackground();
    using (var brush = new SolidBrush(this.ForeColor)) {
        e.Graphics.DrawString(this.Items[e.Index].ToString()), this.Font, brush, e.Bounds);
    }
    // (...)
}
简化的示例代码,请勿使用:

使用GetItemText,DisplayMember的属性值作为字符串返回。由于comboBox1.DisplayMember=Display;,它将返回DataTable显示列的内容

protected override void OnDrawItem(DrawItemEventArgs e)
{
    // (...)
    e.DrawBackground();
    using (var brush = new SolidBrush(this.ForeColor)) {
        e.Graphics.DrawString(this.GetItemText(this.Items[e.Index]), this.Font, brush, e.Bounds);
    }
    // (...)
}

通常,获得此信息的唯一方法是不设置数据源以及DisplayMember和ValueMember。当您不知道映射在哪里时,它只知道支持源是DataRowView。可以显示创建这些动态控件的代码吗?通常不设置显示和值成员导致这种行为。@ TMWORE显示您的代码,如果我们看不到您在做什么,我们将无能为力。这发生在拥有OrrDeFig组合框时,并且在绘制项目时不考虑数据源。顺便说一句,在设置了ComboBox.DataSource的DisplayMember.Yep之后再设置它。查看是否有类似于e.Graphics.DrawStringthis.Items[e.Index].ToString的内容。。。。这是一个典型的不幸:我不知道为什么有人会投反对票。这解决了我的问题。
protected override void OnDrawItem(DrawItemEventArgs e)
{
    // (...)
    e.DrawBackground();
    using (var brush = new SolidBrush(this.ForeColor)) {
        e.Graphics.DrawString(this.Items[e.Index].ToString()), this.Font, brush, e.Bounds);
    }
    // (...)
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
    // (...)
    e.DrawBackground();
    using (var brush = new SolidBrush(this.ForeColor)) {
        e.Graphics.DrawString(this.GetItemText(this.Items[e.Index]), this.Font, brush, e.Bounds);
    }
    // (...)
}