1

我有三个文本框。我需要将每个值添加到相应的字段中。Datagrid 有标题“#, ProductName, ProductCode, Tax, Total”

WPF

                <DataGrid ItemsSource="{Binding dt}" x:Name="dgrdBilling" MinColumnWidth="100" Grid.Row="1" CanUserReorderColumns="False" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="Cell" Margin="1,0,-1,0">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="#" Width="25" CanUserResize="False" MinWidth="25"/>
                        <DataGridTextColumn Header="Name"/>
                        <!--<DataGridTextColumn Header="Name" Binding="{Binding Path=ProductName}"/>-->
                        <DataGridTextColumn Header="Code"/>
                        <DataGridTextColumn Header="Quantity"/>
                        <DataGridTextColumn Header="Price"/>
                        <DataGridTextColumn Header="Tax1"/>
                        <DataGridTextColumn Header="Tax2"/>
                        <DataGridTextColumn Header="Tax3"/>
                        <DataGridTextColumn Header="Total"/>
                    </DataGrid.Columns>
                </DataGrid>

单击按钮事件以将数据添加到数据网格

    private void btnAddProduct_Click(object sender, RoutedEventArgs e)
    {
        SqlCeCommand com = new SqlCeCommand("SELECT * FROM Products_Master WHERE ProductName =('" + txtAutoProductName.Text + "') OR ProductCode = ('" + txtProductCode.Text + "')", con);
        try
        {
            System.Windows.Controls.DataGrid dg = new System.Windows.Controls.DataGrid();
            SqlCeDataAdapter da = new SqlCeDataAdapter();
            BindingSource bSource = new BindingSource();
            DataTable dt = new DataTable();
            DataRow newRow = dt.NewRow();
            da.SelectCommand = com;
            da.Fill(dt);
            bSource.DataSource = dt;
            dg.Items.Add(txtAutoProductName.Text);
            dg.Items.Add(txtAutoProductCode.Text);
            dg.Items.Add(txtQuantity.Text);
            //dgrdBilling.ItemsSource = dt.DefaultView;
            //dgrdBilling.Items.Add(dg);
            da.Update(dt);
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, System.Windows.Forms.Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
4

2 回答 2

2

好像你在这里混淆了很多东西。

首先,您不应该从 WPF 中的代码隐藏操作 UI 元素。您应该有一个适当的数据类型,其中包含 ProductName、ProductCode、Tax、Total 或您可能想要的任何其他字段,填充该类型的集合,并将 THAT 绑定到DataGrid.

public class Product
{
    public string ProductName { get; set; }

    public string ProductCode { get; set; }

    public int Tax { get; set; }

    public int Total { get; set; }
}

存储该类的集合(最好ObservableCollection在 UI 发生更改时通知 UI 以使其自行更新)

public ObservableCollection<Product> Products { get; set;}

通常它应该在您设置为DataContext窗口的不同类(称为ViewModel)中完成,但如果您在代码隐藏中设置它,您可以将窗口设置DataContext为自身。InitializeComponents()添加后在窗口的构造函数中

DataContext = this

现在,使用相关数据创建一个Product并将其添加到集合中,而不是直接添加到网格中:

        Product p = new Product
        {
            ProductName = txtAutoProductName.Text,
            ProductCode = txtAutoProductCode.Text
            // Fill in the rest of the properties as you want ...
        }
        Products.Add(p);

最后,改变你的网格看起来像这样:

<DataGrid ItemsSource="{Binding Products}" x:Name="dgrdBilling" MinColumnWidth="100" Grid.Row="1" CanUserReorderColumns="False" AutoGenerateColumns="False" SelectionMode="Single" SelectionUnit="Cell" Margin="1,0,-1,0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="#" Width="25" CanUserResize="False" MinWidth="25"/>
                    <DataGridTextColumn Header="Name" Binding="{Binding ProductName}"/>
                    <DataGridTextColumn Header="Code" Binding="{Binding ProductCode}"/>
                    <!-- rest of your columns ... -->
                </DataGrid.Columns>
            </DataGrid>

有一些链接可以帮助您更好地理解这个概念:

从 Windows 窗体过渡到 WPF

http://www.codeproject.com/Articles/140621/WPF-Tutorial-Concept-Binding

您还应该研究MVVM模式,这被认为是开发 WPF 应用程序时的最佳实践

祝你好运

于 2013-10-29T06:40:42.567 回答
1

您误解了 WPF 中的绑定以及混合 WinForms 和 WPF 绑定方法。

首先,DataGrid支持直接绑定到实例,因此,设置为 aDataTable就足够了:DataGrid.ItemsSourceDataTable

<DataGrid ItemsSource="{Binding SomDataTable}">

第二,默认情况下可以从模式DataGrid生成列。DataTable如果你想覆盖这个行为,你应该关闭列生成(这是在你的代码中完成的),并且,你应该将你的列与这样的列绑定DataTable

<DataGridTextColumn Header="MyHeader" Binding="{Binding MyDataTableColumnName}"/>

第三,您不想在DataGrid. 您想要一行到DataTable,因此,您的点击处理程序应如下所示:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // ...
        dataTable.Rows.Add(/* ... */);
    }
于 2013-10-29T06:38:29.803 回答