Показване на празен ред в WPF DataGrid, когато DataSet е празен

Изпълнявам 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)


Може би първо можете да проверите източника. ако източникът, който получавате от базата данни, е нулев, тогава ще добавите нов ред в GridView.

person OZnew    schedule 29.11.2011
comment
Може би можете да опитате това dataTable.Rows.Add(dataTable.NewRow()); - person OZnew; 29.11.2011
comment

Прочетох всички въпроси относно съобщенията в JQuery Mobile, но не можах да намеря отговор на моя проблем.

Имам страници със списъци, където всеки елемент от списъка отваря нова страница с резултатите от заявка. Всичко работи правилно, но по време на заявката целевата страница изглежда празна, докато заявката не бъде завършена. Това, което искам, е да информирам потребителя, че се извършва търсене, но не можах да намеря подходящата позиция за поставяне на функцията.

// in each li of list_a I have a href to page_b, that resultas in
// <li id="op1"><a href="/bg#page_b" data-transition="slide" class="ui-link-inherit">Option A</a></li>
// <li id="op2"><a href="/bg#page_b" data-transition="slide" class="ui-link-inherit">Option B</a></li>
// <li id="op3"><a href="/bg#page_b" data-transition="slide" class="ui-link-inherit">Option C</a></li>

$('#list_a').on('click', 'li', function () {
    id = this.id;
    do_query(id);
});
function do_query(id) {
    //$.mobile.showPageLoadingMsg(); // doesn't work
    sql = 'SELECT ... ... ';
    db.transaction(
    function (tx) { tx.executeSql(sql,[id], populate_page, errorHandler); });
}
function populate_page(tx, results) {
    $('#list_b').children().remove('li');
    for (var i = 0; i < results.rows.length; i++) {
        var row = results.rows.item(i);
        $('#list_b').append('result data...').listview('refresh');
    }
}
- 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