簡體   English   中英

ASP.NET C#gridview將復選框值存儲在從Grid View的訪問中

[英]ASP.NET C# gridview Store the checkbox value in access from Grid View

我有一個gridview和窗體。 我已經在Internet上進行搜索,但是找不到如何在數據庫中存儲多個復選框選擇(MS Access)...實際上我想在聯結表中存儲技能ID,以建立多對多關系。幫助我...謝謝

<Columns>
     <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
     <asp:BoundField DataField="Skills" HeaderText="Skills" SortExpression="Skills" />
     <asp:TemplateField HeaderText="Select">
           <ItemTemplate>
               <asp:CheckBox ID="chkSelect" runat="server"  />
            </ItemTemplate>
     </asp:TemplateField>
</Columns>

恕我直言,最好的方法是嘗試將數據轉換為控件期望的形式。 我不是一個訪問專家,Access可以擁有視圖和存儲過程嗎?

我將以一種面向數據庫的方法進行此操作,因為這就是我今天的感覺,但是有些基於C#的方法與此非常相似。

我將針對通用SQL回答這一部分,但您可能需要更多特定於域的人員來弄清楚如何在Access中進行操作。 假設您有兩個表:SkillType和PersonH​​asSkill。 SkillType將是全球最大的技能列表(編碼,寫作,僵屍殺傷),而PersonH​​asSkill將是您的員工與您的技能之間的關系(Fred具有編碼和僵屍殺傷)。

針對與Person交叉連接的SkillType創建視圖。 這將創建一個視圖,該視圖顯示人員和技能類型的每種可能組合。 然后,我們對PersonH​​asSkill進行外部聯接,該聯接實際上定義了這種技能和人的特定組合是否確實存在-在這種情況下,PersonH​​asSkill列在我們看來將為空。 因此,我們然后檢查該Null值,並將其用於視圖中的一列,該列告訴我們此PersonH​​asSkill事情是否正確。

在大多數SQL語言中,這類似於

CREATE VIEW SkillView
SELECT Person.PersonID
, SkillType.*
, CASE WHEN PersonHasSkill.SomeColumn IS NULL THEN 0 ELSE 1 END AS HasSkill
FROM SkillType
CROSS JOIN Person
LEFT OUTER JOIN PersonHasSkill 
  ON SkillType.SkillTypeID = PersonHasSkill.SkillTypeID     
  AND PersonHasSkill.PersonID = Person.PersonID

使用它作為AccessDataSource的選擇目標。 如果願意,可以使用proc代替視圖。 或跳過視圖,然后將其直接填充到AccessDataSource的選擇主體中,而無需“ CREATE VIEW”部分和“ WHERE”子句。 任何。

使用<%#Eval%>語法進行實際綁定。 請參閱http://msdn.microsoft.com/en-us/library/ms178366.ASPX

您實際上不能為此使用GridView提供的預烘焙更新邏輯,因為它們被設計為一次只執行一行,而不是整個表都充滿廢話。 因此,我們將跳過#Bind雙向方法,而僅#Eval單向方法。

簡而言之,要將控件上要綁定到數據值的字段設置為等於<<%#Eval(“ HasSkill)”#>'-使用單引號,因為必須使用雙引號-綁定表達式中的引號。

那么您的情況呢?

        <ItemTemplate>
           <asp:CheckBox ID="chkSelect" runat="server" Checked='<# Eval("HasSkill") />
        </ItemTemplate>

現在我們在表中有了數據。

要更新嗎? 很遺憾成為您,我們必須在代碼隱藏中完成所有工作。 您可以訪問復選框的狀態來進行更新...這實際上不是更新。 如果復選框為“ false”,則要從UserHasSkill表中刪除;如果復選框為TRUE,則要插入...,並且必須檢查UserHasSkill表中是否已存在該行。不轟炸。 要獲取復選框的狀態,請執行

ForEach(GridViewRow row in MyGridView.Rows)
{
  if (row.RowType == DataControlRowType.DataRow) //avoid header/footer rows.
  {
    var myCheckBox = (CheckBox)row.FindControl("chkSelect");
    //myCheckBox.Checked tells you if it's checked or not, yay!
    var myPrimaryKey = (GuidOrIntOrSomething)MyGridView.DataKeys[row.RowIndex].Value;
    //now you have your Key and the checkbox for whether the user has checked it 
    //and you can do your update/insert/delete/whatever against the DB.
  }
}

如果要避免在決定是否刪除/插入之前從數據庫中讀取每個字段,可以將舊提取的結果保存到ViewState中,以便以后使用。 這是一個很小的列表,因此不會破壞ViewState。

是的,真的很簡單。

暫無
暫無

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

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