2013-12-15 181 views
0

方案
我想通過比較參數,如種族,宗教,性別,言語,計算和排名醫護人員是否適合特定的患者,/更新電池等讀取和修改DataTable中

HealthcareWorker table 
---------------------- 
ID (int) 
name (varchar) 
race (varchar) 
religion (varchar) 
gender (varchar) 
german (bit) 
french (bit) 
english (bit) 


Patient table 
------------- 
ID (int) 
name (varchar) 
race (varchar) 
religion (varchar) 
gender (varchar) 
german (bit) 
french (bit) 
english (bit) 


頁面佈局
page1.aspx,會顯示所有Patients的細節gridview表。然後 用戶將選擇Patient和被引導至page2.aspx
page2.aspx會有表示在score的形式,各Healthcare Worker的細節和他是否適合與選定的patient的表。表格中還將有checkboxes,以便將多個Healthcare Worker分配給選定的Patient

page2.aspx 
| ID | name | religion | gender | german | french | english | score |   | 
|----+-------+----------+---------+----------+---------+----------+--------+----------| 
| 4 | mary |   | f | 1  | 0 | 1  | 132 | checkbox | 
| 2 | john |   | m | 0  | 1 | 1  | 125 | checkbox | 
| 3 | tim |   | m | 1  | 0 | 1  | 98 | checkbox | 
| 1 | jane |   | f | 1  | 1 | 0  | 55 | checkbox | 


分數的計算將是這樣的:

if patient.race = healthcareworker.race then healthcarework.score +10 
if patient.religion = healthcareworker.religion then healthcarework.score +10 
if at least one of patient's language match with healthcareworker's language then healthcarework.score +10 


代碼:

Dim strCon As String = ConfigurationManager.ConnectionStrings("ConnectionString1").ConnectionString 
    Dim con As New SqlConnection(strCon) 

    Dim query As String = "select *, CAST (0 as int) score from HealthcareWorker;" 

    Dim cmd As SqlCommand = New SqlCommand(query, con) 

    con.Open() 

    Dim dr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) 
    Dim dt As DataTable = New DataTable() 
    dt.Load(dr) 

    'code to read cell 
    'code to compare and compute 
    'code to update the score in each row 

    GridView1.DataSource = dt 
    GridView1.DataBind() 

    con.Close() 

如何讀取和修改DataTable中的細胞? 我想要讀取並比較每行中某些單元格的數據,然後更新score值。

我需要更新每行的score,所以我將需要一個循環,但我不知道在手前將加載到datatable的行數。 如何獲得datatable中的行數?



編輯/更新:修改了整個問題提供(很多)的更多背景信息

+0

你爲什麼不在數據庫中這樣做?所以用實際計算替換CAST(0爲int)。除此之外,還不清楚你想如何計算分數,'select *'沒有幫助。 –

+0

我簡化了我的實際場景,使其更容易解釋。不要擔心我如何計算'分數'。 '分數'更多的是決定配對矩陣分數而不是遊戲分數。 'score'並不存儲在數據庫中,而是隨時計算和存儲,因爲'score'只適用於'table1'中特定行中的值與另一個表中另一行中值的另一組合。 –

+0

這並不能解釋爲什麼你不能在sql中計算它。你可以在table.Rows上使用for-loop或foreach-loop。但是因爲我不知道這個模式,所以我不能舉一個例子。要訪問和轉換列,請使用row.Field。 –

回答

0

最後一個問題很容易回答:

我需要更新比分每行,所以我將需要一個循環 ,但我不知道將被加載到數據表的 之前的行數。 如何獲取 數據表中的行數?

你只需要使用Rows.Count屬性:

Dim rowCount As Int32 = tblPatient.Rows.Count ' tblPatient => DataTable ' 

如果你想循環的所有行,你可以使用一個foreach

For Each row As DataRow In tblPatient.Rows 
    ' ... ' 
Next 

for -loop:

For i As Int32 = 0 To tblPatient.Rows.Count - 1 
    Dim row As DataRow = tblPatient.Rows(i) 
    ' ... ' 
Next 

要更新,你可以使用SetField擴展方法行也支持可空類型:

For Each row As DataRow In tblPatient.Rows 
    Dim id As Int32 = row.Field(Of Int32)("ID") 
    Dim race As String = row.Field(Of String)("Race") 
    row.SetField("Score", CalculateScore(row)) 
Next 

對不起,我不能爲你提供了正確的計算,但它仍然是不明確的,你想怎麼計算它,因爲你的天堂」 t提供了Score(theres no列)的來源。但它可能會給你一個想法。

+0

thx,現在我有了一個想法。爲了其他人可能正在考慮這一點,'For Each'循環中的'SetField'不起作用,除非我在'loop之前添加'tblPatient.Columns(「Score」)。ReadOnly = False' '。以某種方式在.aspx中設置'readonly = false'不起作用,它只有在.aspx.vb中完成時纔有效 –