【问题标题】:How to dynamically add data to WPF DataGrid如何将数据动态添加到 WPF DataGrid
【发布时间】:2012-01-26 13:24:58
【问题描述】:

我是 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是空的。

如果您有任何想法,请告诉我。 非常感谢!

【问题讨论】:

  • 嗨,Vilem,欢迎来到 S.O 和广阔的 WPF 世界。正如几个用户所指出的,虽然可以将数据直接添加到 DataGrid WPF 控件,但它很笨拙、容易出错,并且不是确保向用户显示数据的推荐方法。我支持您在MVVM design pattern 上查找示例的建议,并熟悉Data BindingViewViewModel

标签: c# wpf datagrid


【解决方案1】:

首先,我认为匿名类型不会在绑定中起作用。您将不得不为此创建一个包装器对象:

// 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());
}

【讨论】:

  • 感谢您的建议,不幸的是我仍然无法绑定它,但这是由于我的经验不足。
【解决方案2】:

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

示例链接:

Link1

Link 2

Link 3

【讨论】:

    【解决方案3】:

    如果想走简单的路:

    1. 用您的数据填充数据表。
    2. 只需将数据网格中的项目源绑定到您的数据表。 (了解 DataBinding 和 MVVM)

      &lt;DataGrid ItemsSource="{Binding MyFilledDataTableProperty}" /&gt;

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

    【讨论】:

      【解决方案4】:

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

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

      在 XAML 中:

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

      现在它工作正常:-)

      【讨论】:

        【解决方案5】:

        这对我有用:

        在 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;
            }
        

        希望有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          • 2017-10-06
          • 2021-11-14
          • 2011-03-04
          • 1970-01-01
          相关资源
          最近更新 更多