如何将数据动态添加到WPF数据网格

本文关键字:数据 WPF 数据网 网格 动态 添加 | 更新日期: 2023-09-27 18:21:25

我是WPF的新手,我想将SQL查询中的数据可视化到WPF DataGrid中。我对如何正确绑定数据有问题:

SqlCommand cmd = new SqlCommand(sql_dotaz, conn);
InfoText.Text += ("Příkaz vytvořen a připojen" + "'n");
try
{
    conn.Open();
    InfoText.Text += ("Připojení otevřeno" + "'n");
    SqlDataReader reader = cmd.ExecuteReader();
    int row_count = reader.FieldCount;  
    ArrayList propoj = new ArrayList();
    for (int i = 0; i < row_count; i++)
    {
        propoj.Add(reader.GetName(i));
        tabView.Columns.Add(new DataGridTextColumn 
            { 
                Header = reader.GetName(i), 
                Binding = new Binding(reader.GetName(i)) 
            });
        //Here is the problem!!!
        tabView.Items.Add(new {propoj[i] = "Hello"});
    }

问题是,当尝试添加一个新项目时,它会抛出一个错误。我不能像这样明确地设置标题名称(Invitation="Hello")。

I also tried
tabView.Columns.Add(new DataGridTextColumn 
    { 
        Header = reader.GetName(i), 
        Binding = new Binding(reader.GetName(i)) 
    });
string record = reader.GetName(i));
tabView.Items.Add(new {record = "Hello"});

但标头名称仍然存在问题——DataGrid为空。

如果你有什么想法,请告诉我。非常感谢!

如何将数据动态添加到WPF数据网格

首先,我认为匿名类型不能在绑定中工作。您必须为此创建一个包装器对象:

// easiest case
public class DatabaseObject
{
    public List<string> Items = new List<string>();
}

有了它,你可以很容易地生成你的列:

// this should be renamed in something like columns or fieldCount...
int row_count = reader.FieldCount;  
for (int i = 0; i < row_count; i++)
{
    tabView.Columns.Add(new DataGridTextColumn 
        { 
            Header = reader.GetName(i), 
            Binding = new Binding("Items[i]") 
        });
}

填写您的DataGrid:

if(reader.HasRows)
{
    do
    {
        DatabaseObject obj = new DatabaseObject();
        for (int i = 0; i < row_count; i++)
        {
            obj.Items.Add(reader.GetString(i));
        }
        tabView.Items.Add(obj);
    }
    while(reader.NextResult());
}

您需要使用DataBinding来管理它,因为您在标记中指定了类似WPF的技术。

示例链接:

Link1

链路2

链路3

如果想走简单的路:

  1. 用你的数据填充一个数据表
  2. 只需将项源从数据网格绑定到数据表即可。(阅读DataBinding和MVVM)

    <DataGrid ItemsSource="{Binding MyFilledDataTableProperty}" />

  3. 设置正确的数据上下文。

在中找到解决方案。也许这不是最好的,但它是有效的。我创建数据集和SQL适配器

adapter.Fill(dSet);
this.DataContext = dSet.Tables[0].DefaultView;

和XAML中:

<DataGrid Height="Auto" Width="Auto" Name="tabView3" ItemsSource="{Binding}" />

现在它工作得很好:-)

这就是我的工作原理:

在XAML文件中:

    <DataGrid Name="YourDataGrid"  CanUserAddRows="true" AutoGenerateColumns="False" RowDetailsVisibilityMode="VisibleWhenSelected" Width="auto" SelectionUnit="FullRow" RowEditEnding="YourDataGrid_RowEditEnding" AddingNewItem="YourDataGrid_AddingNewItem">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="VideoID_column" Binding="{Binding IDVideo, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Video ID" Width="SizeToHeader"/>
                <DataGridTextColumn x:Name="VideoTitle_column" Binding="{Binding Titlu,NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Title" Width="auto"/>
            </DataGrid.Columns>
        </DataGrid>

在.CS文件中

        private void YourDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
    {
        if (e.EditAction == DataGridEditAction.Commit && isInsertMode == true)
        {
            var vid = e.Row.DataContext as video;
            var context = new YourEntities();
            var Video = new video //video is the class
            {
                IDVideo = vid.IDVideo,
                Titlu = vid.Titlu
            };
            context.videos.Add(Video);
            context.SaveChanges();
        }
    }
    private void YourDataGrid_AddingNewItem(object sender, AddingNewItemEventArgs e)
    {
        isInsertMode = true;
    }

希望能有所帮助!