QUEBRAR STRING DE 400 CARACTERES

F001E 16/11/2015 23:25:40
#454010
Boa noite a todos.

Estou montando uma impressão do histórico clinico do paciente. O Dentista informa os dados clínicos que gravado com um campo text no SQL Server, porém na impressão cabem somente 100 caracteres por linha e sendo assim como tem 400 caracteres seriam 4 linhas certo ? Certo, mas para isso fiz algo muito doido, primeiro verifico o tamanho da string. Na impressão da primeira linha faço substring(0,100), segunda linha substring(101,100), terceira linha substring(201,100) e assim vai.
Teria algo mais amigável para fazer isso ? Alguma função pronta do próprio C#? Segue a doideira que montei.


private void printAccomplished(Patient patient, DataTable dt)
{
bool simpleLine = false;
WriteLine(page);

foreach (DataRow dr in dt.Rows)
{
int startString = 1;
int endString = 100;
int countLine = 0;

if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
int totalString = dr[[Ô]accomplished[Ô]].ToString().Length;

for (int line = 1; line <= 6; line++)
{
if (startString >= totalString) break;

countLine++;
if (dr[[Ô]accomplished[Ô]].ToString().Length > 100)
{
string fraseHistorico = Mid(dr[[Ô]accomplished[Ô]].ToString(), startString, endString);
simpleLine = false;
gfx.DrawString(fraseHistorico, fontNormal, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);

startString += fraseHistorico.Length;
endString = (totalString - startString);
if ((totalString - startString) > 100)
{
endString = 101;
}
else
{
endString++;
}

printJumpLine(1);
}
else
{
simpleLine = true;
gfx.DrawString(dr[[Ô]accomplished[Ô]].ToString(), fontNormal, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(6);
break;
}
}
if (countLine < 6)
printJumpLine(simpleLine == true ? countLine : countLine + 1);

WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(10);
}
}
}

private string Mid(string valor, int inicio, int quant)
{
int T = valor.Length;
if (T < quant)
{
quant = T;
}
string strMid = valor.Substring(inicio - 1, quant);
return strMid;
}

JABA 17/11/2015 01:18:13
#454012
Resposta escolhida
Esse código gerará uma lista de strings delimitando-a pelo tamanho especificado.

        public List<String> SepararStrings(string valor, int tamanho)
{
List<string> lista = new List<string>();

if (tamanho <= valor.Length) {
for (int i = 0; i < valor.Length; i = i + tamanho)
{
if (i + tamanho < valor.Length)
lista.Add(valor.Substring(i, tamanho));
else
lista.Add(valor.Substring(i, valor.Length - i));
}
}
return lista;
}


//Para usar você poderia fazer assim:

List<string> lista = new List<string>();
lista = SepararStrings([Ô]suafrase[Ô], 100);

for (int i = 0; i < lista.Count - 1; i++)
{
gfx.DrawString(lista[i], fontNormal, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
}

JABA 17/11/2015 19:35:37
#454060
Era isso que você estava querendo?
F001E 17/11/2015 22:20:13
#454066
Vou fazer o teste agora, estava em outro projeto....
F001E 17/11/2015 23:55:12
#454068
Certo JABA, funcionou. Adicionei algumas particularidades pois precisa pular algumas linhas entre os históricos.
Ficou assim:

private void printAccomplished(Patient patient, DataTable dt)
{
bool simpleLine = false;
WriteLine(page);

foreach (DataRow dr in dt.Rows)
{
int countLine = 0;

if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
string fraseHistorico = dr[[Ô]accomplished[Ô]].ToString();

List<string> lista = new List<string>();
lista = SepararStrings(fraseHistorico, 130);

if (fraseHistorico.Length > 130)
{
countLine = lista.Count;
simpleLine = false;
for (int i = 0; i < lista.Count; i++)
{
gfx.DrawString(lista[i], fontNormalSmall, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(1);
}
}
else
{
countLine = 8;
simpleLine = true;
gfx.DrawString(fraseHistorico, fontNormalSmall, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
}

printJumpLine(simpleLine == true ? countLine : (8 - countLine));

WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(12);
}
}
}
F001E 17/11/2015 23:58:41
#454069
e a impressão ficou assim:
O problema é que a separação de sílaba fica zoada quando muda de linha...
JABA 18/11/2015 01:43:05
#454070
// retirei o tratamento condicional pra pegar valores menores do que 130 e eliminei os caracteres em branco do inicio de cada sentença
public List<String> SepararStrings(string valor, int tamanho)
{
List<string> lista = new List<string>();
for (int i = 0; i < valor.Length; i = i + tamanho)
{
if (i + tamanho < valor.Length)
lista.Add(valor.Substring(i, tamanho).TrimStart());
else
lista.Add(valor.Substring(i, valor.Length - i).TrimStart());
}
return lista;
}


private void printAccomplished(Patient patient, DataTable dt)
{
WriteLine(page);

foreach (DataRow dr in dt.Rows)
{
if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
string fraseHistorico = dr[[Ô]accomplished[Ô]].ToString();

List<string> lista = new List<string>();
lista = SepararStrings(fraseHistorico, 130);

for (int i = 0; i < lista.Count; i++)
{
gfx.DrawString(lista[i], fontNormalSmall, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(1);
}
WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(12);
}
}
}
F001E 18/11/2015 08:16:03
#454078
OK...a noite farei o teste novamente....
F001E 18/11/2015 22:40:14
#454127
Continua a mesma coisa...separação de silaba zoada..
JABA 18/11/2015 22:47:51
#454128
A separação ocorre porque a string está quebrando no meio de uma palavra.
F001E 19/11/2015 05:42:12
#454130
achei um algoritimo de separação de sílabas e vou tentar usa-lo...
Tópico encerrado , respostas não são mais permitidas