Zapis nowej linii w GridView/TemplateField/TextBox

Zapis nowej linii w GridView/TemplateField/TextBox
RS
  • Rejestracja:prawie 21 lat
  • Ostatnio:prawie 11 lat
0

Kolumna GridView:

Kopiuj
<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) ?

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Wrocław
0

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

RS
  • Rejestracja:prawie 21 lat
  • Ostatnio:prawie 11 lat
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ę...

edytowany 2x, ostatnio: RadekS666
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Wrocław
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/>.

S7
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 5 lat
  • Postów:287
0

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

Kopiuj
 
string abc = textBox1.Text;
string tabc = tabc.Replace("<b>", "\r\n");
textBox1.Text = tabc;
Sarrus
<b> - to ten zdefiniowany tag? Być nie może, bo <b> jest tagiem html. Poza tym problem nie polega na braku wstawienia \n w textbox tylko konwersji \n na br
S7
sorry, złego słownictwa użyłem. Puściłem zbyt szybko posta.
RS
  • Rejestracja:prawie 21 lat
  • Ostatnio:prawie 11 lat
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:

Kopiuj
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?

edytowany 1x, ostatnio: RadekS666
_13th_Dragon
Spróbuj tak: TextBox1.Text=TextBox1.Text.Replace("\n","<br />");
RS
Nowa linia to "\r\n", ale w taki sposób też nie działa.
Azarien
Nowa linia to Environment.NewLine. Tak, trochę przydługie...
_13th_Dragon
'\r' zostaną i tak zignorowane jak również spacje.
S7
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 5 lat
  • Postów:287
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

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

a następnie w CodeBehind

Kopiuj
 
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?

edytowany 1x, ostatnio: szymon7500
RS
Nie wiem od kogo -. Twoja instrukcja u mnie niestety nie działa... Jeszcze poszperam jutro, jak by ktoś miał sugestie, to z góry dzięki! :)
S7
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 5 lat
  • Postów:287
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)

Kopiuj
 
<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

Kopiuj
 
 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".

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Wrocław
1
RadekS666 napisał(a):

Próbowałem tak:

Kopiuj
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?
RS
  • Rejestracja:prawie 21 lat
  • Ostatnio:prawie 11 lat
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:

Kopiuj
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ł. ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.