使用数据源向winforms数据网格添加其他列



好吧,第一次我觉得我必须在数据网格上发布很多信息,但没有什么能以我理解的方式解释我需要什么。

        dataBooks.DataSource = null;
        dataBooks.AutoGenerateColumns = true;
        dataBooks.DataSource = _Author.Books.ToList();

这返回了一个对象列表,但是我想添加另一列,在其中我可以调用getType(),它将返回图书格式。

当我将autogeneratecolumns更改为false时,我不知道如何绑定数据,所以我得到了一个空白列表。温柔一点,这对你来说可能很明显,但我是个新手。

我想调用一个方法GetBookType(),它将返回一个字符串。

public abstract partial class Book
{
    public Book()
    {
        this.Orders = new HashSet<Order>();
    }
    public string AuthorName { get; set; }
    public string Title { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
    public int Year { get; set; }
    public virtual Author Author { get; set; }
    public virtual ICollection<Order> Orders { get; set; }
}

以及将返回类型字符串的分部类

公共抽象分部类clsBook{公共重写字符串ToString(){返回此。标题+"\t"+这个。年份+"\t"+这个。价格+"\t"+这个。数量+"\t"+这个。GetType();}

    public abstract void EditDetails();
    public abstract string GetBookType();

您不需要设置AutoGenerateColumns = false,只需手动将列正常添加到DataGridView即可。我想您想添加一个名为NewColumn的列,该列应该绑定到DataSource的数据成员NewColumData。这是代码:

DataGridViewTextBoxColumn newColumn = new DataGridViewTextBoxColumn(){Name = "NewColumn", DataPropertyName="NewColumnData"};
dataBooks.Columns.Add(newColumn);
dataBooks.DataSource = _Author.Books.ToList();

列自动生成的工作原理如下:如果DataMember已被DataGridView中的某个现有列绑定,则底层DataSource中的所有DataMember都将循环通过,而将使用此列,并且不会创建任何新列。在上面的代码中,您现有的列是NewColumn,此列已经通过属性DataPropertyName绑定到DataSourceNewColumnData,因此使用此列而不是创建新列。所有其他列都是正常自动创建的。

更新

我不明白你为什么要有一个像GetBookType这样的方法,如果你想在一列中显示它,只需为它添加一些属性,而不是像这样:

public abstract partial class Book
{
  public Book()
  {
    this.Orders = new HashSet<Order>();
  }
  //other properties of yours go here
  //--------------------------------
  //---------------------------------
  public string BookInfo {
       get {
          return this.Title + "t" + this.Year + "t" + this.Price + "t" + this.Quantity + "t" + this.GetType();
       }
  }
}
//Then you can bind your list to your DataGridView like this
DataGridViewTextBoxColumn newColumn = new DataGridViewTextBoxColumn(){Name = "NewColumn", DataPropertyName="BookInfo"};//Notice the BookInfo which is assigned as the DataPropertyName for your new column.
dataBooks.Columns.Add(newColumn);
dataBooks.DataSource = _Author.Books.ToList();

我希望这一次,它是你想要的。

当AutoGenerateColumns为false时,必须为每个属性添加DataGridTextColumn,如下所示,其中Name和BookType是Book类的属性。

<sdk:DataGrid Name="dataGrid" AutoGenerateColumns="False" SelectionMode="Single">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTextColumn 
                Header="Book Name" 
                Binding="{Binding Name, Mode=TwoWay}"/>
            <sdk:DataGridTextColumn 
                Header="Book Type" 
                Binding="{Binding BookType, Mode=TwoWay}"/>
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

最新更新