簡體   English   中英

如何在SQL Server返回的DataGrid中顯示數據(沒有代碼)

[英]How to display data in DataGrid returned from SQL Server (no code behind)

SO的新手和我的第一個問題。

我花了一天的時間研究並試圖解決這個問題。 我發現的所有示例都顯示了通過單擊按鈕將所有內容放入代碼中的情況。 或一些展示將SQL邏輯放入ViewModel中的展示。 我試圖使SQL邏輯脫離視圖和視圖模型。

我有一個文本框,用戶可以在其中輸入搜索值。 將根據SQL Server表搜索該值。 我使用斷點時會看到這些值,因此一切都可以正常工作。 在那之后,我只是想不出如何在DataGrid中顯示它們。 退出循環時,這些值會丟失。

如果我將自動生成的列更改為“ True”,則會看到列名,因此我認為綁定設置正確。 當設置為“ True”時,它還會顯示名稱為HasErrors的列,這似乎很奇怪。

如何獲取此數據以顯示在DataGrid中? 我認為問題是因為我沒有返回這些值,但不確定在當前情況下如何實現這些值。 我要解決這個錯誤,是否需要以其他方式進行? 我應該改用DataReader嗎?

我缺少什么和/或做錯了什么?

人.cs

public class Person : ValidationBase
{
    private string lastname;

    public string LastName
    {
        get { return lastname; }
        set
        {
            if (lastname != value)
            {
                lastname = value;
                OnPropertyChanged();
            }
        }
    }

    private string firstname;

    public string FirstName
    {
        get { return firstname; }
        set
        {
            if (firstname != value)
            {
                firstname = value;
                OnPropertyChanged();
            }
        }
    }

    private string emailaddress;

    public string EmailAddress
    {
        get { return emailaddress; }
        set
        {
            if (emailaddress != value)
            {
                emailaddress = value;
                OnPropertyChanged();
            }
        }
    }
}

模型

public static bool SearchUser(string UserLookupTextBox) //<-- Textbox value from ViewModel
{
    using (SqlConnection con = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand("Select [LastName], [FirstName], [EmailAddress] from [User] where (LastName=@Lookup)", con))
    {
        var person = new Person();
        cmd.Parameters.Add("@Lookup", SqlDbType.VarChar).Value = UserLookupTextBox.Trim()             

        DataTable dt = new DataTable();

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);

        for (int i = 0; i < dt.Rows.Count; ++i)
        {
            person.LastName = dt.Rows[i][0].ToString();
            person.FirstName = dt.Rows[i][1].ToString();
            person.EmailAddress = dt.Rows[i][2].ToString();

            //how do I return this to Person or to datagrid??
        };
    }  //<--Values get lost here

    return true;
}

視圖模型

    private ObservableCollection<Person> updateusersearch = new ObservableCollection<Person>();

    public ObservableCollection<Person> UpdateUserSearch
    {
        get { return updateusersearch; }
        set
        {
            updateusersearch = value;
            OnPropertyChanged();
        }
    }

    private void ExecuteSearchUser(object parameter) 
    {
        bool SearchUser = NewUserModel.SearchUser(UserLookupTextBox); <--passing textbox value to Model
    }

    public NewUserViewModel()
    {
        SearchUserCommand = new RelayCommand(ExecuteSearchUser, CanExecuteSearchUser);
    }

XAML

<DataGrid //<--Cut everything else to keep short. Others columns identical setup
        DataContext="{Binding UpdateUserSearch}"
        ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn
                Header="Last Name"
                Binding="{Binding LastName, Mode=TwoWay, ValidatesOnNotifyDataErrors=True, UpdateSourceTrigger=PropertyChanged,ValidatesOnExceptions=True, NotifyOnValidationError=True}">
                <DataGridTextColumn.HeaderStyle>
                    <Style TargetType="DataGridColumnHeader">
                        <Setter Property="HorizontalContentAlignment"
                                Value="Center" />
                    </Style>
                </DataGridTextColumn.HeaderStyle>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

這是我的解決方案。 每個評論者都以一種或另一種方式提供了幫助,謝謝大家的幫助。 我仍然覺得有更好的方法(除了提到的實體框架)。 希望其他人將來會添加這些方法,以便其他人找到。 我也將期待EF的未來發展。 您在網上找到的資料中,似乎有80%或更多顯示了如何做錯事。 他們教您編寫SQL可注入代碼。 在WPF中使用按鈕單擊。 等等,這里只需要有更多的“好”內容。 也許這會在某些時候幫助別人。 它實現了我加載數據網格的目標。

以下是所做的更改。 如果看不到,則與有問題的發布相同。 除了我將UpdateUserSearch更改為UserSearch之外,還更改了XAML和ObservableCollection中的內容。

查看模型

private void ExecuteSearchUser(object parameter)
{
    LoadUserSearch(); 
}

NewUserModel.UserSearch model = new NewUserModel.UserSearch();
private void LoadUserSearch()
{
    DataTable table = model.GetUserData(UserLookupTextBox, SearchByComboBox);

    for (int i = 0; i < table.Rows.Count; ++i)
        UserSearch.Add(new Person()
        {
            LastName = table.Rows[i][0].ToString(),
            FirstName = table.Rows[i][1].ToString(),
            EmailAddress = table.Rows[i][2].ToString(),
        });
    table.Dispose();
}

模型

public class UserSearch 
{
    public DataTable GetUserData(string UserLookupTextBox, string SearchByComboBox)
    {
        using (SqlConnection con = new SqlConnection(connectionString))
        using (DataTable dt = new DataTable())
        if (SearchByComboBox == "Last Name")
        {
            using (SqlCommand cmd = new SqlCommand("Select [LastName], [FirstName], [EmailAddress] from [DbUser] where (LastName=@Lookup)", con))
            {
                cmd.Parameters.Add("@Lookup", SqlDbType.VarChar).Value = UserLookupTextBox.Trim();
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(dt);
                    return dt;
                }
            }
        }
        else
        {
        ........
        }
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM