Показать пустую строку в WPF DataGrid, когда набор данных пуст

Я запускаю SQL-запрос к базе данных SQL Server 2008. Результаты этого запроса отображаются в 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();
        }

Если кто-нибудь может помочь мне получить эту пустую строку, чтобы пользователь мог вводить данные, я был бы очень признателен!

Спасибо!


person Eric R.    schedule 29.11.2011    source источник


Ответы (4)


Может быть, вы можете сначала проверить источник. если источник, который вы получаете из базы данных, имеет значение null, вы добавите новую строку в GridView.

person OZnew    schedule 29.11.2011
comment
Возможно, вы можете попробовать этот dataTable.Rows.Add(dataTable.NewRow()); - person OZnew; 29.11.2011
comment
Я думаю, что это для winforms. В сетке данных WPF нет свойства Rows для добавления строк. - person Eric R.; 29.11.2011
comment
Свойство Rows не для DataGrid, а для DataTable - person OZnew; 29.11.2011
comment
Я могу это сделать, только проблема сейчас в том, что у меня есть пустая строка И у меня есть пустая строка, в которую пользователь может добавить данные. Итак, у меня есть две пустые строки. - person Eric R.; 29.11.2011
comment
Я просто придумал обходной путь для этого. Если в моем наборе данных нет строк, я добавлю одну вручную и изменю CanUserAddRows на false. Тогда у меня есть только одна пустая строка. Как только пользователь добавит допустимые данные в эту строку, я снова изменю CanUserAddRows на true и оставлю это так. Спасибо за помощь! - person Eric R.; 29.11.2011

Я только начинаю это понимать, но пока это работает.

    <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"); }
    }
}

И в реальном окне вы должны установить DataContext для DataGrid

public UserAlertWindow()
    {

        InitializeComponent();

        this.DataContext = new ViewModel.UserAlertWindowViewModel();
        UserAlertsGrid.DataContext = new ViewModel.UserAlertWindowViewModel(this);
    }

А для обновления базы данных, когда пользователь редактирует или удаляет, проверьте эту ссылку, она выглядит очень многообещающе. http://www.dotnetcurry.com/ShowArticle.aspx?ID=566

person Ben Petersen    schedule 15.03.2012

Попробуйте установить CanUserAddRows на true из DataGrid

person Haris Hasan    schedule 29.11.2011

Используйте 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();
        }
    }
}
person Guido Mocha    schedule 01.01.2020