C# 仅从DataTable动态填充DataGridView列

C# 仅从DataTable动态填充DataGridView列,c#,datagridview,C#,Datagridview,我正在编写一个股票系统,我正在使用的当前界面允许用户向数据库添加项目。每个项目类型都有一个不同的表 我目前可以做的是用整个表及其内容填充DataGridView,这显然不理想 我希望发生的是,用户从组合框中选择要添加到数据库中的项目类型,然后使用该项目对应表中的列(而不是内容)填充DataGridView。然后,用户可以添加新行并填充字段 下面是组合框后面的代码,这也允许用户从第二个组合框中选择子类型 var row = comboBox1.SelectedItem.ToStri

我正在编写一个股票系统,我正在使用的当前界面允许用户向数据库添加项目。每个项目类型都有一个不同的表

我目前可以做的是用整个表及其内容填充
DataGridView
,这显然不理想

我希望发生的是,用户从
组合框
中选择要添加到数据库中的项目类型,然后使用该项目对应表中的列(而不是内容)填充
DataGridView。然后,用户可以添加新行并填充字段

下面是
组合框
后面的代码,这也允许用户从第二个
组合框
中选择子类型

        var row = comboBox1.SelectedItem.ToString();
        comboBox2.Items.Clear();
        comboBox2.Text = "";

        if (comboBox1.SelectedItem.ToString() == "ARRAYS")
        {
            var nameDT = (from names in ARRAYS.AsEnumerable()
                          where names.Field<string>("Array Type") != null
                          select names.Array_Type);

            var cleanList = nameDT.Distinct().ToArray();
            foreach (var item in cleanList)
            {
                comboBox2.Items.Add(item);
            }
        }
        if (comboBox1.SelectedItem.ToString() == "BATT_CHARGER")
        {
            var nameDT = (from names in BATT_CHARGER.AsEnumerable()
                          where names.Field<string>("BATT_SIZE") != null
                          select names.BATT_SIZE);

            var cleanList = nameDT.Distinct().ToArray();
            foreach (var item in cleanList)
            {
                comboBox2.Items.Add(item);
            }
        }
        if (comboBox1.SelectedItem.ToString() == "BUFFERBOX")
        {
            var nameDT = (from names in BUFFERBOX.AsEnumerable()
                          where names.Field<string>("BufferBox Type") != null
                          select names.BufferBox_Type);

            var cleanList = nameDT.Distinct().ToArray();
            foreach (var item in cleanList)
            {
                comboBox2.Items.Add(item);
            }
        }
var row=comboBox1.SelectedItem.ToString();
comboBox2.Items.Clear();
comboBox2.Text=“”;
如果(comboBox1.SelectedItem.ToString()=“数组”)
{
var nameDT=(来自数组中的名称。AsEnumerable()
其中names.Field(“数组类型”)!=null
选择名称。数组类型);
var cleanList=nameDT.Distinct().ToArray();
foreach(cleanList中的var项)
{
comboBox2.Items.Add(item);
}
}
如果(组合框1.选择EdItem.ToString()=“电池充电器”)
{
var nameDT=(来自BATT_CHARGER.AsEnumerable()中的名称)
其中names.Field(“BATT_SIZE”)!=null
选择名称。电池尺寸);
var cleanList=nameDT.Distinct().ToArray();
foreach(cleanList中的var项)
{
comboBox2.Items.Add(item);
}
}
如果(comboBox1.SelectedItem.ToString()=“BUFFERBOX”)
{
var nameDT=(来自BUFFERBOX.AsEnumerable()中的名称)
其中names.Field(“缓冲盒类型”)!=null
选择名称。缓冲盒(类型);
var cleanList=nameDT.Distinct().ToArray();
foreach(cleanList中的var项)
{
comboBox2.Items.Add(item);
}
}
如何将
DataGridView
列设置为与它们将保存到的表相同,而不使用所有行数据填充

阵列

缓冲盒

电池充电器


都是表名,数组类型、BATT_大小和缓冲盒类型都是列名

我最后做了这件完美的事

 if (comboBox1.SelectedItem.ToString() == "USB_RS232")
        {
            var nameDT = (from names in USB_RS232.AsEnumerable()
                          where names.Field<string>("MODEL") != null
                          select names.MODEL);

            datatable = USB_RS232;

            var cleanList = nameDT.Distinct().ToArray();
            foreach (var item in cleanList)
            {
                comboBox2.Items.Add(item);
            }
        }


        dataGridView1.Columns.Clear();
        foreach (DataColumn item in datatable.Columns)
        {
            var colname = item.ColumnName.ToString();
            dataGridView1.Columns.Add(colname, colname);
        }
if(组合框1.SelectedItem.ToString()=“USB\U RS232”)
{
var nameDT=(来自USB_RS232.AsEnumerable()中的名称)
其中names.Field(“MODEL”)!=null
选择名称(模型);
数据表=USB_RS232;
var cleanList=nameDT.Distinct().ToArray();
foreach(cleanList中的var项)
{
comboBox2.Items.Add(item);
}
}
dataGridView1.Columns.Clear();
foreach(datatable.Columns中的DataColumn项)
{
var colname=item.ColumnName.ToString();
dataGridView1.Columns.Add(colname,colname);
}

当您从
组合框
中选择时,
数据表
被选中,然后我只是在
数据表
中循环浏览列名,并将它们添加到DGV中

是否将autogeneratecolumns设置为true?您可以只生成列,在需要之前不填充表。除了默认设置之外,dgv上没有其他设置。如何构建列?@JamesMorrish您能发布当前填充
DataGridView
的代码吗?它只是在
if
语句中,数据源根据所选的表而变化。dataGridView1.DataSource=BUFFERBOX;我强烈建议
DataGridView1.AutoGenerateColumns=False
(与上述相反)。首先(但不是最后一个),您希望将适当的标题文本放在列中,可能会将数字向右对齐,设置单位等。我将创建一个简单的
DataTable
(以DB为单位,甚至是硬编码的),其中包含列名、列标题文本和表类型(=哪种类型的产品),您还可以使用对齐、后缀等枚举列(测量单位)等。然后动态创建列,循环此
数据表
,使用
进行过滤。在加载
数据网格视图1
内容之前,选择(“TableType=“+)
)。