Zapis nowej linii w GridView/TemplateField/TextBox

0

Kolumna GridView:

<asp:TemplateField HeaderText="News_text" SortExpression="News_text">
    <EditItemTemplate>
        <asp:TextBox runat="server" TextMode="MultiLine" Text='<%# Bind("News_text") %>' ID="TextBox1"></asp:TextBox>
    </EditItemTemplate>                
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("News_text") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

Jak zrobić przy edycji rekordu zapis znaku nowej linii? Tak aby przy zatwierdzaniu był on przekonwertowany na
(lub coś takiego) ?

0

Użyj kontrolki Literal zamiast Label i po prostu wstaw tam tekst zawierający znak <br/>.

0
somekind napisał(a):

Użyj kontrolki Literal zamiast Label i po prostu wstaw tam tekst zawierający znak <br/>.

Chodziło mi o kontrolkę TextBox dzięki której edytuję tekst. Jak w tym textbox'ie robię enterem przejście do nowej linii i zapisuję, to przejście do nowej linii jest zmieniane na spację...

1

Nic nie jest zamieniane (no chyba, że Ty to robisz), po prostu przeglądarka nie wyświetla znaków nowej linii.
Po prostu zamień znaki nowej linii wpisane do TextBoxa na tag <br/>.

0

nowa linia w textbox "\n" lub zdefinuj jakiś tag i użyj

 
string abc = textBox1.Text;
string tabc = tabc.Replace("<b>", "\r\n");
textBox1.Text = tabc;
0
somekind napisał(a):

Nic nie jest zamieniane (no chyba, że Ty to robisz), po prostu przeglądarka nie wyświetla znaków nowej linii.
Po prostu zamień znaki nowej linii wpisane do TextBoxa na tag <br/>.

Próbowałem tak:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    TextBox tb1 = (TextBox)this.GridView1.FindControl("TextBox1");
    tb1.Text = tb1.Text.Replace(Environment.NewLine, "<br />");
} 

Niestety dla ostatniej linii wywala błąd "Odwołanie do obiektu nie zostało ustawione"(System.NullReferenceException), w czym popełniłem błąd? I czy dobrego zdarzenia użyłem?

1

przetestowałem Twój kod u siebie i niby u mnie to działa ponżej podaję rozwiązanie

dodaj do textboxa zdarzenie OnTextChanged

 
<EditItemTemplate>
        <asp:TextBox runat="server" TextMode="MultiLine" Text='<%# Bind("news_text") %>' ID="tb1" OnTextChanged = "tb1_TextChanged" ></asp:TextBox>
    </EditItemTemplate>      

a następnie w CodeBehind

 
protected void tb1_TextChanged(object sender, EventArgs e)
 {
TextBox thisTextBox = (TextBox)sender;
GridViewRow thisGridViewRow = (GridViewRow)thisTextBox.Parent.Parent;
int row = thisGridViewRow.RowIndex;

TextBox w = (TextBox)GridView1.Rows[row].Cells[0].FindControl("tb1");
w.Text = w.Text.Replace(Environment.NewLine, "<br />");
}

i daj znać czy o to Ci chodziło. Aha .... popraw tylko na swoje numery kolumn, wierszy tam gdzie to jest wymagane.

PS. czemu dostałem minusowy punkt?

1

kurczę nie wiem testowałem na Visual 2005 i 2010, poniżej masz pełny kod udoskonalony, działa u mnie, bez znacznków podczas wyświetlania w textboxie

kod asp.net (najważniejsze przy Labelu zamień na Eval i wprowadź Replace)

 
<div>
        <asp:GridView ID="GridView1" AutoGenerateColumns = "false" runat="server" 
            DataSourceID="SqlDataSource1" AutoGenerateEditButton = "true" 
            DataKeyNames = "news_number"  >
        <Columns>
        <asp:TemplateField HeaderText="News_text" SortExpression="News_text">
    <EditItemTemplate>
        <asp:TextBox runat="server" TextMode="MultiLine" Text='<%# Bind("news_text") %>' ID="TextBox1" OnTextChanged = "TextBox1_TextChanged" ></asp:TextBox>
    </EditItemTemplate>                
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Eval("news_text").ToString().Replace("\n", "<br />") %>'></asp:Label>
    </ItemTemplate>
      </asp:TemplateField>
     </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:szymonConnectionString %>" 
            SelectCommand="SELECT [news_number], [news_text] FROM [news_test]" 
            UpdateCommand="UPDATE [news_test] SET [news_text] = @news_text where [news_number] = @news_number" >
            <UpdateParameters>
            <asp:Parameter Type = "Int32" Name = "news_number" />
            <asp:Parameter Type = "String" Name = "news_text" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div>

kod z CodeBehind

 
 protected void TextBox1_TextChanged(object sender, EventArgs e)
        {
            TextBox thisTextBox = (TextBox)sender;
            GridViewRow thisGridViewRow = (GridViewRow)thisTextBox.Parent.Parent;
            int row = thisGridViewRow.RowIndex;

            TextBox w = (TextBox)GridView1.Rows[row].Cells[0].FindControl("TextBox1");
            w.Text = w.Text.Replace(Environment.NewLine, "\n");
        }

Jeśli masz coś podobnego to musi działać. Być może wywala Ci błąd o niebezpiecznej zawartości, to w sekcji Page dodaj ValidateRequest="false".

1
RadekS666 napisał(a):

Próbowałem tak:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    TextBox tb1 = (TextBox)this.GridView1.FindControl("TextBox1");
    tb1.Text = tb1.Text.Replace(Environment.NewLine, "<br />");
} 

Niestety dla ostatniej linii wywala błąd "Odwołanie do obiektu nie zostało ustawione"(System.NullReferenceException), w czym popełniłem błąd? I czy dobrego zdarzenia użyłem?

  1. Sprawdź co jest nullem i postaraj się, żeby nie było.
  2. Nie wiem, czy użyłeś dobrego zdarzenia, a jakiego chcesz użyć? W którym momencie odbywa się to "zatwierdzenie rekordu" u Ciebie?
0

Wydaje mi się że moim problemem było to że nie odnajdywało mi tego textbox'a i zwracało null. Ulepszone metody obsługujące pole edycji:

protected void TbNewText_DataBinding(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = tb.Text.Replace("<br />", Environment.NewLine);
}
protected void TbNewText_TextChanged(object sender, EventArgs e)
{
    TextBox tb = (TextBox)sender;
    tb.Text = tb.Text.Replace(Environment.NewLine, "<br />");
} 

Przy zapisie nowa linia jest zmianiana na znacznik "
", aby dobrze się wyświetlała w label'ach. A przy odczycie
na nową linię, aby użytkownik się nie zastanawiał co to za
mu się pojawił. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1