Показать пустую строку в WPF DataGrid, когда DataSet пуст - PullRequest
0 голосов
/ 29 ноября 2011

Я выполняю 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();
        }

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

Ответы [ 3 ]

1 голос
/ 15 марта 2012

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

    <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

1 голос
/ 29 ноября 2011

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

0 голосов
/ 29 ноября 2011

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

...