2012-04-07 23 views
1

テキストファイルから読み込んだすべての行の値を含むgridviewがあります。私がしたいのは、グリッドビュー上の選択した行を編集して削除することです。GridView(VB .Net)でテキストファイルの行を編集して削除する

'''''Read every row then show it on gridview''''' 

' Declarations 
Dim objStreamReader As New StreamReader(Server.MapPath("Announcement.txt")) 
Dim arrText As New ArrayList 

' Loop through the file and add each line to the ArrayList 
Do While objStreamReader.Peek() >= 0 
    arrText.Add(objStreamReader.ReadLine) 
Loop 

' Close the reader 
objStreamReader.Close() 

' Bind the results to the GridView 
GVAnnouncement.DataSource = arrText 
GVAnnouncement.DataBind() 

私は何をお願いするつもりですが、私が選択した行のリターンの指標を得るのですか、次のとおりです。背後にあるコードで

<asp:GridView ID="GVAnnouncement" runat="server" 
    AutoGenerateColumns="True" EmptyDataText="- No file saved -"> 
    <Columns> 
    <asp:TemplateField HeaderText="No."> 
     <ItemTemplate> 
     <%# Container.DisplayIndex + 1%> 
     </ItemTemplate> 
    </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

:私はすでに、テキストファイルのすべての行を表示するためのコードを持っていますテキストボックスに値を入力し、それをテキストファイルに更新しますか?どうもありがとうございました。

+0

は、このフォームまたはASPですか? – Arion

+0

@Arion:これはASP .Netのためのものです。 –

答えて

1

をグリッドをバインドします。このような:通常はファイルが最適なストレージではありません。あなたは代わりにdbmsを使用することを検討するかもしれません。

ファイル内の行を編集/削除する場合は、すべての行をもう一度作成するのが一番簡単です。 たとえば、インデックスをHiddenFieldに格納することができます。

<ItemTemplate> 
    <asp:HiddenField runat="server" ID="HiddenIndex" Value="<%# Container.DataItem.Index %>" /> 
    <asp:Label ID="LblAnnouncement" Text="<%# Container.DataItem.Announcement %>" runat="server"></asp:Label> 
</ItemTemplate> 

Dim allAnnouncements = IO.File.ReadAllLines(Server.MapPath("Announcement.txt")) 
Dim source = allAnnouncements.Select(Function(l, index) New With {.Index = index, .Announcement = l}).ToList 

' Bind the results to the GridView 
GVAnnouncement.DataSource = source 
GVAnnouncement.DataBind() 

次に、あなたは、次の方法でそれらを削除/編集することができます。

Protected Sub GridView1_RowUpdated(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) 
    Dim grid = DirectCast(sender, GridView) 
    Dim index = Int32.Parse(DirectCast(grid.Rows(e.RowIndex).FindControl("HiddenIndex"), HiddenField).Value) 
    Dim oldAnnamouncement = e.OldValues(0).ToString 
    Dim newAnnouncement = e.NewValues(0).ToString 
    If Not oldAnnamouncement.Equals(newAnnouncement) Then 
     Dim allAnnouncements = IO.File.ReadAllLines(Server.MapPath("Announcement.txt")) 
     allAnnouncements(index) = newAnnouncement 
     IO.File.WriteAllLines(Server.MapPath("Announcement.txt"), allAnnouncements) 
    End If 

    'Reset the edit index. 
    GridView1.EditIndex = -1 

    'Bind data to the GridView control. 
    BindData() 
End Sub 



Protected Sub GridView1_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) 
    Dim grid = DirectCast(sender, GridView) 
    Dim index = Int32.Parse(DirectCast(grid.Rows(e.RowIndex).FindControl("HiddenIndex"), HiddenField).Value) 

    Dim allAnnouncements = IO.File.ReadAllLines(Server.MapPath("Announcement.txt")) 
    IO.File.WriteAllLines(Server.MapPath("Announcement.txt"), allAnnouncements.Where(Function(l, i) index <> i)) 

    'Bind data to the GridView control. 
    BindData() 
End Sub 
+0

dbmsを使用するのではなく、どこでも動かすことができるので、データを保存するためにテキストファイルを使用することを検討しています。私はあなたのコードを試しましたが、それは列が2回表示されました。コードには重複はありません、右: '{.Index = index、.Announcement = l}'。 Btw、行> 0だけを表示する方法は? –

+0

保存用にテキストファイルを使用する場合は、同時に複数のユーザーがファイルを編集する効果を考慮してください。 2人のユーザーが同時に行を削除したためにファイル全体が失われたくない場合。 – Kratz

1

void RowDeletedを使用できます。私は行を識別する何かをDatakeysに保存します。あなたはにそのkeysを使用して、これまでに何をしたいかを行うことができます。

ASPX

<asp:GridView ID="GVAnnouncement" DataKeyNames="ID" runat="server" 
onrowdeleted="GVAnnouncement_RowDeleted" ... 

CS

Sub GVAnnouncement_RowDeleted(ByVal sender As Object, ByVal e As GridViewDeletedEventArgs) 
    e.Keys("ID") 
End Sub 

ファイル内のIDを検索し、最初の1つの提案を行を削除し、再度

+0

こんにちはアリオン、考えてくれてありがとう。私はそれを試してすぐに結果を教えてくれるでしょう:) –

関連する問題