当数据集为空时,在WPF数据网格中显示空白行

本文关键字:网格 数据网 显示 空白 数据 WPF 数据集 | 更新日期: 2023-09-27 18:15:57

我正在运行SQL Server 2008数据库上的SQL查询。该查询的结果显示在WPF DataGrid中。我的代码工作得很好,除了当数据集是空的。我希望用户能够添加新行,但是当数据集为空时,没有可供用户输入数据的空行。下面是我的代码:

        try
        {
            string accountQuery = "SELECT a.AccountName AS 'Account Name', a.AccountDesc AS 'Account Description', " +
                "a.AccountNumber AS 'Account #', b.AccountType AS 'Account Type', c.AccountName AS 'Account Parent' " +
                "FROM Accounts AS a INNER JOIN AccountType AS b ON a.AccountTypeID = b.AccountTypeID " +
                "LEFT OUTER JOIN Accounts AS c ON c.AccountID = a.AccountParentID " +
                "WHERE a.UserID = " + currentUserID;
            SqlDataReader accounts = null;
            SqlCommand query = new SqlCommand(accountQuery, dbConnection);
            accounts = query.ExecuteReader();
            DataTable accountsTable = new DataTable();
            accountsTable.Load(accounts);
            this.GridAccounts.ItemsSource = accountsTable.DefaultView;
            accounts.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            // Close the DB if there was an error.
            if (dbConnection.State == ConnectionState.Open)
                dbConnection.Close();
        }

如果有人可以帮助我得到这个空行,以便用户可以输入数据,我将非常感激!

谢谢!

当数据集为空时,在WPF数据网格中显示空白行

也许你可以先检查一下源代码。如果你从数据库获得的源是空的,那么你将添加一个新的行到GridView。

我刚刚开始理解这个,但这到目前为止是有效的。

    <DataGrid CanUserAddRows="True" CanUserDeleteRows="True" ItemsSource="{Binding UserAlerts}" IsSynchronizedWithCurrentItem="True" x:Name="UserAlertsGrid">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Node ID" Binding="{Binding Node_id}"></DataGridTextColumn>
            <DataGridTextColumn Header="Threshold" Binding="{Binding Threshold}"></DataGridTextColumn>
            <DataGridTextColumn Header="Type of Alert" Binding="{Binding TypeOfAlert}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

然后让'CanUserAddRows'工作,你需要一个默认的构造函数在你的ViewModel(在那里你做绑定)。如果没有默认构造函数,则不会得到空行。

    class UserAlertViewModel : BaseViewModel
{
    private readonly UserAlert _alertItem;
    public UserAlertViewModel()
    {
        _alertItem = new UserAlert();
    }
    public UserAlertViewModel(UserAlert alertItem)
    {
        _alertItem = alertItem;
    }
    public int Node_id
    {
        get { return _alertItem.Node_id; }
        set { _alertItem.Node_id = value; OnPropertyChanged("Node_id"); }
    }
    public double Threshold
    {
        get { return _alertItem.Threshold; }
        set { _alertItem.Threshold = value; OnPropertyChanged("Threshold"); }
    }
    public string TypeOfAlert
    {
        get { return _alertItem.TypeOfAlert; }
        set { _alertItem.TypeOfAlert = value; OnPropertyChanged("TypeOfAlert"); }
    }
}

在实际的窗口中,你必须为DataGrid设置DataContext

public UserAlertWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel.UserAlertWindowViewModel();
        UserAlertsGrid.DataContext = new ViewModel.UserAlertWindowViewModel(this);
    }

并且当用户编辑或删除时更新数据库,检查这个链接,它看起来很有希望。http://www.dotnetcurry.com/ShowArticle.aspx?ID=566

尝试设置CanUserAddRowsDataGridtrue

使用ListCollectionView作为源代码:

datagrid.CanUserAddRows = true;
datagrid.ItemsSource = new ListCollectionView(items_list);

,然后下面的函数添加空行,如果没有出现:

public void AddNewRow()
{
    if (datagrid.Items is System.ComponentModel.IEditableCollectionViewAddNewItem items)
    {
        if (!items.IsAddingNew)
        {
            items.AddNew();
        }
    }
}