在我的Windows窗体应用程序中,我有一个DataGridView,它将通过后台代码中的DataTable以编程方式绑定。我这样做了好几个星期,但这是因为我没有在DGV设计器中手动指定列和列类型 - 因此在绑定表时会自动创建列。
一旦我手动给出列名和列名,并将DGV的AutoGenerateColumns属性设置为false,那么绑定后DGV中总是只有1行,并且所有值都为null - 所以看起来我的DataTable的值似乎是映射到DGV。我确保DGV中列的名称与我的DataTable中列的名称相匹配。
有什么想法吗?这里有一些代码(目前无法复制和粘贴任何代码,所以这里对我的内容大致了解):
DataTable dt = new DataTable();
dt.Columns.Add("ID",typeof(long));
//etc...
var linqQuery = //perform linq query to get data
foreach (var data in linqQuery)
{
dt.Rows.Add(data.ID,//etc);
}
dgv.DataSource = dt;
答案 0 :(得分:1)
由于您打开了AutoGenerateColumns,因此需要将DGV中每个列的DataPropertyName设置为DataSource中匹配的Column Name。
答案 1 :(得分:1)
我自己的白痴。我没有设置DataPropertyName。 D'哦。谢谢!
答案 2 :(得分:0)
您可以尝试这样..将datagrid视图列映射到datatable ..
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestWinApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
DataSet dsPlayerList = new DataSet();
DataTable dt = new DataTable("PlayerList");
dsPlayerList.Tables.Add(dt);
dt.Columns.Add("ID",typeof(int));
dt.Columns.Add("Name",typeof(string));
dt.Columns.Add("Type", typeof(string));
dt.Columns.Add("IP", typeof(string));
DataRow dr = dt.NewRow();
dr["ID"] = 1;
dr["Name"] = "Player 1";
dr["Type"] = "Standard";
dr["IP"] = "127.0.0.1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = 2;
dr["Name"] = "Player 2";
dr["Type"] = "Standard";
dr["IP"] = "127.0.0.1";
dt.Rows.Add(dr);
dt.AcceptChanges();
this.dgvPlayerList.AutoGenerateColumns = false;
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Name";
col.Name = "Name";
col.HeaderText = "Name";
this.dgvPlayerList.Columns.Add(col);
col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Type";
col.Name = "Type";
col.HeaderText = "Type";
this.dgvPlayerList.Columns.Add(col);
this.dgvPlayerList.DataSource = dsPlayerList.Tables["PlayerList"];
}
}
}