【问题标题】:C# Show certain rows from a tableC# 显示表格中的某些行
【发布时间】:2017-04-07 03:48:45
【问题描述】:

我在一个数据库中有 2 个表。一种与用户有关,另一种与社会有关。像这样的:

Users table:                Societies table:
ID   User   Pass            ID   UserID   Societies
1    Mark   123             1      1      Pepsi
2    John   abc             2      1      Lays
3    Paul   a1b             3      2      Unilever
                            4      3      Nestle

UserID 具有来自用户表的 ID 的外键。

还有 2 种形式:用户登录面板和 Datagridview 社团中显示的一种。

现在,我尝试弄清楚,当我以用户身份登录时,只显示具有该用户特定 UserID 的社团。

我在 Second Form 中制作了这种方法来显示特定的社会,但我不知道在等号括号中放什么。我尝试了很多可能性,但没有任何效果......

private void btnLoad_Click(object sender, EventArgs e)
{
   DCApp db = DCApp.NewDC();

   User logedUser = db.Users.FirstOrDefault(s => s == Program._us);

   List<Society> ListSociety = db.Societies.Where(s => s.UserID.Equals(logedUser)).ToList();

   _bs.DataSource = ListSociety;
   dgwUser.DataSource = _bs;
   dgwUser.Refresh();
   _bs.ResetBindings(false);    
}

如果您有一些提示,请给我一条路径。

我的其余代码:

程序.cs

using System;
using System.Windows.Forms;

namespace Users
{
 static class Program
 {
  public static User _us;
  [STAThread]
  static void Main()
  {
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   frmLogin f = new frmLogin();
   if (f.Run(out _us))
   {
    Application.Run(new frmUsers());
   }
   else
   {
    Application.Exit();
   }
  }
 }
}

frmLogin.cs

namespace Users
{
 public partial class frmLogin : Form
 {
  bool _Result = false;
  User _user;

  public frmLogin()
  {
   InitializeComponent();
  }
  internal bool Run(out User us)
  {
   us = _user;
   ShowDialog();
   return _Result;
  }

  private void btnLogin_Click(object sender, EventArgs e)
  {
   if (cmdPassword.Text.Length == 0 || cmdUser.Text.Length == 0)
   {
    errH.SetError(btnLogin, "!");
    return;
   }
   using (DCApp db = DCApp.NewDC())
   {
   List<User> logInP = db.Users.Where(s => s.UserPassword.ToLower().Equals(cmdPassword.Text.ToLower().Trim()) && s.UserName.ToLower().Equals(cmdUser.Text.ToLower())).ToList();
    if (logInP.Count == 0)
    {
     _Result = false;
    }
    else if (logInP.Count > 1)
    {
     _Result = false;
    }
    else
    {
     _Result = (bool) logInP.FirstOrDefault().IsActive;
     _user = logInP.First();
    }
   }
   Close();
  }

  private void btnCancel_Click(object sender, EventArgs e)
  {
   Application.Exit();
  }
 }
}

frmUsers.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace Users
{
 public partial class frmUsers : Form
 {
  BindingSource _bs = new BindingSource();

  public frmUsers()
  {
   InitializeComponent();
   InitControls();   
  }
  private void InitControls()
  {
   dgwUser.AutoGenerateColumns = false;
  }
  private void btnLoad_Click(object sender, EventArgs e)
  {
   DCApp db = DCApp.NewDC();

   User logedUser = db.Users.FirstOrDefault(s => s == Program._us);

   List<Society> ListSociety = db.Societies.Where(s => s.UserID.Equals(logedUser)).ToList();

   _bs.DataSource = ListSociety;
   dgwUser.DataSource = _bs;
   dgwUser.Refresh();
   _bs.ResetBindings(false);    
  }
 }
}

【问题讨论】:

  • _bs 是什么?
  • 你能查一下gwUser.DataSource=ListSociety
  • 你需要使用类似.Where(s =&gt; s.UserID.Equals(UserIdOfLoggedInUser))的东西。但是如何找到UserIdOfLoggedInUser 取决于您,因为我们看不到您的所有代码。
  • @Eldeniz _bs 是 BindingSourice 的变量名。 BindingSource _bs = new BindingSource();
  • @PeterB 我知道我必须使用类似的东西,但我现在将把所有其余的代码都放上去

标签: c# winforms linq datagridview


【解决方案1】:

您使用的是 asp.net 会员服务提供商吗?如果是,那么您可以使用下面的代码来获取 id:

MembershipUser user = Membership.GetUser();
string id = user.ProviderUserKey.ToString();

【讨论】:

  • 您只需要从文本文件或 XML 之类的地方检索您登录的用户 ID。
  • 我不使用网络服务。
  • 基本上您将用户对象存储在登录表单和程序类中,用户表单不知道您需要将用户对象传递给用户表单构造函数才能使用的用户对象'code' public frmUsers(User loggedUser) { InitializeComponent();初始化控件(); }
【解决方案2】:

我认为问题是dgwUser.AutoGenerateColumns = false;

要么

private void InitControls()
  {
   dgwUser.AutoGenerateColumns = true;
  }

或者

 private void AddColumns()
    {

        var col1 = new DataGridViewTextBoxColumn();
        var col2 = new DataGridViewCheckBoxColumn();
        var col3 = new DataGridViewCheckBoxColumn();

        col1.HeaderText = "YourHeaderText";
        col1.Name = "ID";

        col2.HeaderText = "YourHeaderText";
        col2.Name = "UserID";

        col3.HeaderText = "YourHeaderText";
        col3.Name = "Socities";

        dgwUser.Columns.AddRange(new DataGridViewColumn[] {col1,col2,col3});
    }




     ...
      List<Society> ListSociety = db.Societies.Where(s => s.UserID.Equals(logedUser.ID)).ToList();
      _bs.DataSource = ListSociety;
       dgwUser.DataSource = _bs;
       AddColumns();
       dgwUser.Refresh();
       _bs.ResetBindings(false);   
       ...

【讨论】:

    【解决方案3】:

    我解决了这个问题!这就是我所做的:

    在 frmLogin.cs 中

    ...
      internal bool Run(out User user)
      {      
       ShowDialog();
       user = _user;
       return _Result;
      }
    ...
    

    在 frmUsers.cs 中

    private void btnLoad_Click(object sender, EventArgs e)
      {
       DCApp db = DCApp.NewDC();
    
       User logedUser = db.Users.FirstOrDefault(s => s == Program._user);
    
       List<Society> ListSociety = db.Societies.Where(s => s.UserID == logedUser.ID).ToList();  
    
       _bindingSource.DataSource = ListSociety;
       dgwUser.DataSource = _bindingSource;
       dgwUser.Refresh();
       _bindingSource.ResetBindings(false);    
      }
    

    谢谢大家的建议!

    【讨论】:

      猜你喜欢
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2010-11-24
      • 2013-05-20
      相关资源
      最近更新 更多