【问题标题】:Store SQL Database in an Object?将 SQL 数据库存储在对象中?
【发布时间】:2017-12-14 23:10:12
【问题描述】:

更新:我想我明白了。任何额外的建议表示赞赏。

我已连接到我的数据库,但现在我希望能够使用该数据。我想用项目(仅限大图标/小图标视图)填充 ListView,然后能够使用 SelectedItemsChanged 单击项目以在文本框中查看它们和/或能够更新值。

(ListView 在启动时显示所有数据/项目。用户可以选择一个项目。该项目包含数据。该数据显示在适当的控件中。)

所以我创建了另一个类“UserInfo”来存储它们。在我的主窗体上,我设置了 getter,但我不确定如何做 setter。

int row = 0;
public UserInfo userData
        {

            get
            {
                    string sqltest = data.Rows[row]["occupationId"].ToString();
                    decimal val;
                    decimal.TryParse(sqltest, out val);
                    UserInfo u = new UserInfo();
                    u.FirstName = data.Rows[row]["firstname"].ToString();
                    u.LastName = data.Rows[row]["lastname"].ToString();
                    u.UserName = data.Rows[row]["username"].ToString();
                    u.occupId = val;
                    u.ImageIndex = 0;

                return u;              
            }
            //Setter 
        }

通常你会有类似thisValue = value.Text 我做不到data.Rows[row]["lastname"].ToString() = value.Lastname

我可以在设置器中使用string f = data.Rows[row]["firstname"].ToString(); 吗?

感谢您的帮助,将根据需要进行编辑。

【问题讨论】:

    标签: c# database winforms listview


    【解决方案1】:

    请注意,该属性取决于row 的值。属性依赖于其他属性不是一个好习惯。也许你可以实现一个indexed property

    public UserInfo UserData[int row] {
        get {
           return new UserInfo { 
              FirstName = data.Rows[row]["firstname"].ToString(),
              //Remaining fields
           }
        }
        set {
            data.Rows[row]["firstname"] = value.FirstName;
            //Remaining fildes
        }
    }
    

    另外,我假设occupancyId 在数据库中以十进制形式存储,并且不允许空值。如果它允许空值,您可以像这样检查:

    decimal val = data.Rows[row]["occupationId"] == DBNull.Value ? 0.0m; (decimal)data.Rows[row]["occupationId"];
    

    如果你不需要索引属性,代码如下。

    注意DataRow fields 被声明为对象。您可以为对象分配(设置)任何值。 在 getter 中,您必须将对象转换为具体类型

    int row = 0;
    public UserInfo userData
        {
    
            get
            {
                    UserInfo u = new UserInfo();
                    u.FirstName = data.Rows[row]["firstname"].ToString();
                    u.LastName = data.Rows[row]["lastname"].ToString();
                    u.UserName = data.Rows[row]["username"].ToString();
                    u.occupId = (double)data.Rows[row]["occupationId"];
                    u.ImageIndex = 0;
    
                return u;              
            }
            set
            {
                    data.Rows[row]["firstname"] = value.FirstName;
                    data.Rows[row]["lastname"] = value.LastName;
                    data.Rows[row]["username"] = value.UserName;
                    data.Rows[row]["occupationId"] = value.occupId;
            }
        }
    

    【讨论】:

    • 感谢您的回答。我也遇到了使用 for 循环添加项目的问题,但由于我使用的是行,所以它在 10 结束,然后引发 outofindex 错误。
    • 使用 foreach 而不是经典 for。或者如果使用,您可以获取处理表单数据的总行数。Rows.Count
    • 添加项目时,它使用 userData。如果我使用 say int i = 0 而不是 row = 0 然后使用 for 循环,它只会使用索引 0,因为我没有在我的 userData 中循环
    • 真的,getter / setter 近似不好。您有两个以上的操作。 read->getter,update->setter,但你还需要添加和删除。要添加新记录,您可以实现 Add(UserData user) 方法
    • 通常我会有像文本框这样的控件,所以它更容易。使用数据库,我不确定。我只是用 (foreach row...) 填充它,但是我可以使用每个项目吗?它也没有很好地显示,除非它在我没有使用的详细信息视图中。所以把它放到一个对象中,只显示名字,然后能够点击它来显示项目值是我想要的。现在我只专注于此。
    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2011-02-14
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多