将数据从 ADO.NET 绑定到 WPF。

3

我正在创建一个WPF页面,希望使用DataGrid来展示使用SqlDataAdapter执行的SQL查询结果。我使用C#编程,在后台代码中查询的相关代码如下:

string sqlStr2 = "SELECT Conference_Name, Year FROM ....";
SqlDataAdapter dAdapt2 = new SqlDataAdapter(sqlStr2, cnStr);
DataSet dataSet2 = new DataSet();
dAdapt2.Fill(dataSet2);

从查询中获得的数据必须插入两列。然而,我无法在XAML文件中绑定它们。以下是XAML代码:

<Grid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="2" VerticalAlignment="Top"
    HorizontalAlignment="Left">
    <DataGrid Name="dtg1" AutoGenerateColumns="False"
        RowHeaderWidth="0" ItemsSource="{Binding Path=dataSet2}"
        Margin="0,0,0,-23">
        <DataGrid.Columns>
            <DataGridTextColumn Width="110" Header="Conference"
                Binding="{Binding Path=Conference_Name}"/>
        <DataGridTextColumn Width="110" Header="Year"
                Binding="{Binding Path=Year}"/>
    </DataGrid.Columns>
</DataGrid>

当我运行程序时,数据不可见。出了什么问题?我应该在XAML文件的头部行中声明一个源吗?

datatSet2需要是一个公共属性,并且窗口的DataContext需要是代码后台。 - paparazzo
你的后台代码是什么样子的呢?你能创建一个方法,在加载事件中调用一个名为BindData()的方法,然后创建BindData()方法并将你的DataAdapter代码放在那里吗? - MethodMan
3个回答

1

0

您需要在此绑定DataContext,以下是我在代码后台绑定到Listbox的示例,请将您的示例替换为下面发布的内容

//string sqlStr2 = "SELECT Conference_Name, Year FROM ....";
//SqlDataAdapter dAdapt2 = new SqlDataAdapter(sqlStr2, cnStr);
//DataSet dataSet2 = new DataSet();
//dAdapt2.Fill(dataSet2);

form load 
{ 
   call BindData();
} //this is sudu code.. 

private void BindData()
{
    DataSet dtSet = new DataSet();
    using (connection = new SqlConnection(connectionString))
    {
        command = new SqlCommand(sql, connection);              
        SqlDataAdapter adapter = new SqlDataAdapter();          
        connection.Open();
        adapter.SelectCommand = command;
        adapter.Fill(dtSet, "Customers");
        listBox1.DataContext = dtSet;
    }

}

使用此链接作为一个好的例子,或者使用MSDN和Google搜索 如何在C#和XAML中将数据集中的表绑定到WPF数据网格


0

就像@silverninja所写的那样,您必须绑定到DataTable,并且像往常一样,您需要正确的DataContext。我希望您能使用MVVM。我不明白的是,为什么您在代码后台中完成所有操作时还要使用绑定。

丑陋的代码后台:

public class Window1: Window
{
    private void Anymethod()
    {
        //just some code pieces
        string sqlStr2 = "SELECT Conference_Name, Year FROM MyTable";
        SqlDataAdapter dAdapt2 = new SqlDataAdapter(sqlStr2, cnStr);
        DataSet dataSet2 = new DataSet();
        dAdapt2.Fill(dataSet2);
        this.dtg1.ItemsSource = dataSet2.Tables["MyTable"].DefaultView;
    }
}

没有绑定的XAML,因为你不需要它:

<DataGrid Name="dtg1" AutoGenerateColumns="False" RowHeaderWidth="0"
          Margin="0,0,0,-23">
    <DataGrid.Columns>
        <DataGridTextColumn  Width="110"  Header="Conference"
            Binding="{Binding Path=Conference_Name}" />
        <DataGridTextColumn Width="110" Header="Year"
            Binding="{Binding Path=Year}" />
    </DataGrid.Columns>
</DataGrid>

注:

  • 代码是手写的。
  • 你应该真正地研究MVVM,它可以让事情更清晰。
  • 如果你想混合使用代码和绑定,你只需要设置DataContext并绑定到你的DataTablepublic property

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接