代码之家  ›  专栏  ›  技术社区  ›  IAbstract

使用DataGridViewRow.DataBoundItem-转换为可枚举对象?

  •  2
  • IAbstract  · 技术社区  · 15 年前

    我有一个DataGridView

    myGridView.DataSource = GetSomeData()
    
    
    // method called
    public IQueryable GetSomeData()
    {
        var source = from r in records
                     select r;
    
        return source;    // made correction from 'r' to 'source'
    }
    

    GetSomeData() 按预期填充DataGridView。用户将选择要编辑的行,然后将行数据传递给表单。自从 DataGridViewRow.DataBoundItem 是匿名类型,如何通过 DataBoundItem ?

    我一半以为我的数据边界项是可量化的-不正确。以下是调试器在DataBoundItem属性上的信息:

    DataBoundItem{CustomerID=“3133”, Last_Name=“Smith”,名字= “John”,帐号=“JS3133”, ActiveYN=True}<匿名类型>

    将数据传递到新表单后,我希望执行以下操作:

    txtFName.Text = SomeEnumeratedObject["First_Name"];
    txtLName.Text = SomeEnumeratedObject["Last_Name"];
    

    我能怎么做吗?如果新表单上的控件可以绑定到 SomeEnumeratedObject .

    是否可以查询 数据边界项 和林肯在一起?

    编辑:

    更改方法:

    public DataView GetSomeData()
    {
        var source = from r in records
                     select r;
    
        DataTable table = ToDataTable(myContext, source);
        return new DataView(table);
    }
    

    见完整解决方案 here .

    3 回复  |  直到 8 年前
        1
  •  1
  •   Jeff Ogata    15 年前

    你可以把它当作 dynamic 以这种方式访问属性:

    public void Test(dynamic item)
    {
        MessageBox.Show(string.Format("{0} : {1}", item.First_Name, item.Last_Name));
        textBox1.DataBindings.Add("Text", _item, "First_Name");
        textBox2.DataBindings.Add("Text", _item, "Last_Name");
    }
    

    要考虑的一件事是匿名类型的属性是只读的,因此您的用户将无法以这种方式编辑值。从C语言规范:

    匿名类型的成员是从用于创建该类型实例的匿名对象初始值设定项推断出的只读属性序列。

    您应该考虑为此声明一个类型,而不是使用匿名类型。这样,您还将获得intellisense的好处,并且能够在没有任何问题的情况下重命名/重构您的属性。

        2
  •  1
  •   kevev22    15 年前

    记录中有哪些类型的对象?您应该能够将DataGridViewRow.DataBoundItem强制转换为任何类型的对象记录。

    假设记录是客户对象的列表。你应该可以去:

    txtFName.Text = ((Customer)DataGridViewRow.DataBoundItem).First_Name;
    txtLName.Text = ((Customer)DataGridViewRow.DataBoundItem).Last_Name; 
    

    如果这不可能,那么我认为你必须使用反射:

    Type type = DataGridViewRow.DataBoundItem.GetType();  
    String firstName = (String)type.GetProperty("First_Name")
                            .GetValue(DataGridViewRow.DataBoundItem, null);
    
        3
  •  0
  •   IAbstract    15 年前

    kevev22&adrift都有一个正确的想法:创建一个类来保存数据。因为我可以将IQueryable结果集转换为数据表,所以这样做才有意义:

    public DataView GetSomeData()
    {
        var source = from r in records
                     select r;
    
        DataTable table = ToDataTable(myContext, source);
        return new DataView(table);
    }
    

    现在:

    myDGView.DataSource = GetSomeData();
    

    并且,当选择datagrid行时,可以将 DataBoundItem DataRow .

    FYI-要将IQueryable resultset转换为数据表,请执行以下操作:

    public DataTable ToDataTable(DataContext context, IQueryable source)
    {
        DataTable table = new DataTable();
        {
            adapter.SelectCommand = context.GetCommand(source);
            sqlCommand.Connection.Open();
            adapter.FillSchema(table, SchemaType.Source);
            adapter.Fill(table);
        }
    
        return table;
    }