根据 id C# 将相关数据填充到选定行

Posted

技术标签:

【中文标题】根据 id C# 将相关数据填充到选定行【英文标题】:Populate correlated data to selected row based on id C# 【发布时间】:2022-01-03 07:50:10 【问题描述】:

我正在尝试使用人口统计表填充患者表中匹配的患者 ID 数据。我正在使用两种不同的形式。我最近的尝试是加入两个表并调用.Where() 来匹配 ID。

这可行,但它会调用所有匹配的数据。目标是仅调用“患者”表单中的选定行。最初我尝试选择 PatientID,然后将其与 C_PatientID 匹配,但没有成功。

            var patientID = _db.Patients.Where(i => i.PatientID > 0).Select(i => new
        
            PatientNumber = i.PatientID,

        );

我最近的尝试是使用选定的行索引,但还没有弄清楚如何正确实现它来调用患者数据。

            var patientID = gvDemographics.SelectedCells.Cast<DataGridViewCell>()
                              .Select(cell => cell.RowIndex)
                              .Distinct();

要加载的初始表单是患者,一旦选择了行,它应该调用人口统计数据。请指教。

使用 Microsoft SQL Server Management Studio 处理数据。填充患者的第一种形式

 private void PopulateGrid()
    


        var records = _db.Patients.Select(q => new
        
            PatientNumber = q.PatientID,
            PatientFirstName = q.PatientFirstName,
            PatientLastName = q.PatientLastName,
            DateOfBirth = q.DateOfBirth,
            Gender = q.Gender,
            Address = q.Address,
            State = q.State,
            City = q.City,
            ZipCode = q.ZipCode,
            ContactNumber = q.ContactNumber,
            Email = q.Email,
        ).ToList();

        gvPatients.DataSource = records;
        gvPatients.Columns["PatientNumber"].HeaderText = "Patient#";
        gvPatients.Columns["PatientFirstName"].HeaderText = "First Name";
        gvPatients.Columns["PatientLastName"].HeaderText = "Last Name";
        gvPatients.Columns["DateOfBirth"].HeaderText = "DOB";
        gvPatients.Columns["ZipCode"].HeaderText = "Zip Code";
        gvPatients.Columns["ContactNumber"].HeaderText = "Contact Number";
        //Hide the column for ID. Changed from the hard coded column value to the name, 
        // to make it more dynamic. 
        gvPatients.Columns["PatientNumber"].Visible = true;

    

调用第二个表单的按钮

        private void btnViewMedicalHistory_Click(object sender, EventArgs e)
    

        var viewMedicalHistory = new Demographics();
        viewMedicalHistory.MdiParent = this.MdiParent;
        viewMedicalHistory.Show();
    

【问题讨论】:

当然匹配所有数据,每个ID都大于0:i.PatientID > 0 为什么要获取您已经知道的患者 ID?可能会得到整个病人? @LeandroBardelli 我有太多代码,以至于我复制了错误的代码。我一直在使用不同的方法来仅匹配一个患者 ID。一张表有患者信息,另一张表有相同的患者人口统计数据或病史。当表单加载时,所有患者的列表会显示在网格视图中。如果我从网格视图中选择一名患者,我想以新形式提取该患者的病史 【参考方案1】:

如果您在第一页上注明了哪些控件或显示数据的方式,将会有所帮助。

我的意思是,假设我有一个酒店列表 - 像这样:

    <asp:GridView ID="GridView1" runat="server" CssClass="table" Width="45%"
        AutoGenerateColumns="False" DataKeyNames="ID" >
        <Columns>
            <asp:BoundField DataField="FirstName" HeaderText="FirstName"     />
            <asp:BoundField DataField="LastName" HeaderText="LastName"       />
            <asp:BoundField DataField="HotelName" HeaderText="HotelName"     />
            <asp:BoundField DataField="City" HeaderText="City"               />
            <asp:BoundField DataField="Description" HeaderText="Description" />
            <asp:TemplateField HeaderText="View">
                <ItemTemplate>
                    <asp:Button ID="cmdView" runat="server" Text="View" cssclass="btn"
                        OnClick="cmdView_Click"
                        />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

我们像这样填充网格:

   protected void Page_Load(object sender, EventArgs e)
    
        if (!IsPostBack)
            LoadGrid();
    

    void LoadGrid()
    
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        
            using (SqlCommand cmdSQL = new SqlCommand("SELECT * from tblHotels ORDER BY HotelName", conn))
            
                conn.Open();
                DataTable rst = new DataTable();
                rst.Load(cmdSQL.ExecuteReader());
                GridView1.DataSource = rst;
                GridView1.DataBind();
            
        
    

所以我们的输出现在是这样的:

而获取数据库行主键的按钮点击是这样的:

    protected void cmdView_Click(object sender, EventArgs e)
    
        Button btn = (Button)sender;
        GridViewRow gRow = (GridViewRow)btn.Parent.Parent;

        int PKID = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];

        Session["PKID"] = PKID;

        Response.Redirect("ShowOneHotel.aspx");

    

注意非常接近我没有公开,甚至显示/显示上述 GV 中的数据库主键,但我能够点击行,获取行索引,并从中获得 PK 值(即DataKeyNames="ID" 是干什么用的。

现在,将 PK id 从当前页面传递到下一页是一件简单的事情 - 我使用了 session.所以现在,在您跳转到的下一页中,您可以检索并显示信息。

请注意,我什至没有真正关心 GV 的“选定”行设置 - 只需放入平面简按钮,写下平面简按钮单击,然后像我一样获取 PK 和行索引。

【讨论】:

我对造成的混乱表示歉意,因为我实际上并没有使用 asp.net。我觉得你的方法实际上可以工作,除非我从未使用过它。我目前正在使用 Microsoft SQL Express 服务器作为数据库,并使用 lambda 表达式来检索两种形式的数据。我将在最初的帖子中包含我的代码以进行澄清@Albert-d-kallal

以上是关于根据 id C# 将相关数据填充到选定行的主要内容,如果未能解决你的问题,请参考以下文章

如何根据列表框中的选定行填充多个文本框

将选定的行复制到填充 Xcode 中另一个 UITableView 的数组

从数据库中删除选定的数据表行

根据同一张表中是不是存在相关行获取行

从接口自动化测试框架设计到开发数据依赖相关

将下拉菜单中的相关信息显示到文本框中(来自 SQL 数据库,使用 PHP、AJAX 和 HTML)