|
Well, if I understand correctly what you're trying to do should be as easy as parsing the text in the richTextBox control and looking for the <b> and <i> tags. The easiest (not the most efficient) way to do this is to do a two-pass parse of the text. First for the BOLD tags and second for the ITALIC text.
Whenever you run into an open BOLD tag, increment boldCount variable and store the position. Then remove the tag from the text. Whenever you run into a close BOLD tag, decrement boldCount, and remove the colsing tag from the text. When boldCount = 0, select the text starting at the recorded position and then set it's bold property to TRUE. Keep going until the end of the text.
Repeat for the ITALIC tags.
Here is an example that does bold tags. Modifying this code to do italic text is trivial so it wasn't included here.. Hope this helps and don't forget to visit digitalGetto
private void ParseBoldText(RichTextBox tb)
{
int boldCount = 0;
int lastBoldStartPosition = 0;
int currentPosition = 0;
while (currentPosition < tb.Text.Length - 3)
{
if (tb.Text.Substring(currentPosition, 3) == "<b>")
{
if(boldCount == 0)
lastBoldStartPosition = currentPosition;
boldCount++;
}
if (tb.Text.Substring(currentPosition, 4) == "</b>")
{
boldCount--;
if (boldCount == 0)
{
tb.Select(lastBoldStartPosition + 3, currentPosition - lastBoldStartPosition - 3);
tb.SelectionFont = new Font(tb.SelectionFont.FontFamily, tb.SelectionFont.Size, tb.SelectionFont.Style | FontStyle.Bold);
}
}
currentPosition += 1;
}
tb.Rtf = tb.Rtf.Replace("<b>", "");
tb.Rtf = tb.Rtf.Replace("</b>", "");
}
----
www.digitalGetto.com
-- modified at 18:07 Tuesday 20th June, 2006
|
|
|
|
|
Thanks but this is not working:
tb.Rtf = tb.Rtf.Replace("[b]", "");<br />
tb.Rtf = tb.Rtf.Replace("[/b]", "");
I still have all the tags shown.
-- modified at 19:28 Tuesday 20th June, 2006
|
|
|
|
|
Also you said: the easiest (not the most efficient)
Can you give me an idea about the most efficient way?
|
|
|
|
|
Well, when I said the method was not the most efficient I meant that for large texts it will most likely be rather slow. Depending on your needs you may or may not want to put in the extra effort to look for/implement more efficient algorithms.
The performance hit of the method shown is due to the fact that it reads each character in the text. That is time consuming. A first optimization is to combine looking for BOLD tags with looking for ITALIC tags. That is, to use the same loop to do both. That way, you cut the time approximately in half. Another option you may consider is using unsafe code (pointers) to loop through the text. Yet another possibility is to use regular expressions to perform the search and replace.
As far as the other problem goes (the code not replacing the tags), that is rather strange. I've tested the code before posting it here and it worked. Can you give me more details as to how it fails?!
----
www.digitalGetto.com
|
|
|
|
|
Hi...I'm just a newby in C# programming. really need help bout an application i'm doing. I would like to change the file extensions of certain files regarding data encryption. But what i also want to do is, how will I associate my customized files with a special icon that I would put into my project in visual studio 2005? Anybody pls. help....
kirkangel
|
|
|
|
|
You typically do this with a setup project. In Visual Studio, you can add a Setup Project to your solution. Inside the setup project, you can go into the File Association editor and setup a custom association between a file extension and your app. IIRC, you can set an icon for the association as well.
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Goof around music jam with my brothers (with video)
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
Tnx a lot... you've been very helpfull...! God bless!
|
|
|
|
|
I created a windows form in VS2005 that uses Enterprise Library - DAAB - version Jan 2006 to access the DB in its constructor. Everything works fine; however, when I created a UserControl that attempts to store that form as a variable, the VS 2005 designer will not let me drag that UserControl onto a new form. It gives me the following error:
“Failed to create component ‘UserControl’. The error message follows: ‘System.NullReferenceException: Object reference not set to an instance of object. At Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.get_DefaultName(), at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseMapper.MapName(String name, IConfigurationSource configSource)…….”
Everything compiles successfully without errors; however, I am unable to use the UserControl on any forms. After debugging, I found that the error is caused by the line “Database db = DatabaseFactory.CreateDatabase();” This line is standard DAAB code and is supposed to work and it does works in all cases I’ve run across EXCEPT this.
Is this a bug in the DAAB, or VS Designer, or am I missing something? Any help will be appreciated! Thanks in advance!
Below is the relevant code:
public partial class SampleControl : UserControl
{
private ProductForm subForm = new ProductForm();
public SampleControl ()
{
InitializeComponent();
}
}
public partial class ProductForm : Form
{
public ProductForm()
{
InitializeComponent();
AccessDB();
}
private void AccessDB()
{
//THIS LINE CAUSES THE DESIGNER ERROR
Database db = DatabaseFactory.CreateDatabase();
}
}
Thanks for any help
|
|
|
|
|
Could be a bug in the designer. If it's not necessary to create a database instance in the ocntrol's designer, you can modify your code so it doesn't get loaded in design mode:
public ProductForm()
{
InitializeComponent();
if(!this.DesignMode)
{
AccessDB();
}
}
Tech, life, family, faith: Give me a visit.
I'm currently blogging about: Goof around music jam with my brothers (with video)
The apostle Paul, modernly speaking: Epistles of Paul
Judah Himango
|
|
|
|
|
Hi,first you must know runtime and design time,
When you drag a control to your design panel in vs,
this is design time, in constructor you want to
initialize some thing, like Database db = DatabaseFactory.CreateDatabase(); but may be this operation need read some
information and this must be in Runtime not in designtime
so you will get an error.
You can have a try, not in VS design enviournment,
but in Run time to create your control or forms
may this help you
|
|
|
|
|
Note I also posted this on the SQL page as I think it might be a problem with that but not sure.
I have the user enter a part number, click a button, which loads the datagrid. I've been playing around with the SQL statement as I was getting duplicate rows. Now, when the grid loads there is completely bogus data from the database. Not sure what it's tied to or if it's just the first record. Does anyone know what may be causing this issue? I have included the SQL info for reference:
private void Page_Load(object sender, System.EventArgs e)<br />
{<br />
if(!Page.IsPostBack)<br />
{<br />
BindData();<br />
}<br />
}<br />
private void BindData()<br />
{<br />
strPartNumberInputReference = txtPartNumberInput.Text;<br />
<br />
<br />
string SQLString = "SELECT p.PartNumber, pt.description, dd.DrawingNumber, dd.DrawingRevision, dd.DwgPath FROM parts p INNER JOIN PartTypes pt on pt.ID =p.PartTypeID LEFT JOIN DraftingData dd on dd.PartID = p.ID WHERE p.PartNumber = @PartID;SELECT w.weight, wt.Description AS wtDescription, p.PartNumber from weights w INNER JOIN weighttypes wt on wt.ID = w.weighttypeid INNER JOIN Parts p on w.PartID = p.ID;SELECT c.cost, p.PartNumber, ct.Description AS ctDescription from Costs c INNER JOIN Parts p ON c.PartID = p.Id INNER JOIN CostTypes ct on ct.Id = c.CostTypeID; SELECT s.SubPartID, s.Quantity, s.Sequence, p.PartNumber FROM SubParts s INNER JOIN Parts p ON s.PartID = p.Id "; <br />
<br />
SqlCommand cmd = new SqlCommand();<br />
cmd.Connection = new SqlConnection(strConnectSQL);<br />
cmd.CommandText = SQLString;<br />
cmd.Parameters.Add ("@PartID", strPartNumberInputReference);<br />
SqlDataAdapter adapter = new SqlDataAdapter(cmd);<br />
adapter.Fill(ds);<br />
ds.Tables[1].TableName = "Weights";<br />
ds.Tables[2].TableName = "Costs";<br />
ds.Tables[3].TableName = "Subparts";<br />
<br />
dgParts.DataSource = ds;<br />
dgParts.DataBind();<br />
txtPartNumberInput.Text = "";<br />
}
So either I have duplicates or bogus stuff. Does anyone see the problem? I really have tried to work this one out but get one problem or the other!
|
|
|
|
|
I confused your codes may be right but i never seen like this!!!
<br />
string strSqlQuery="SELECT * FROM Table WHERE id=@id" ;<br />
sqlConnection cnn = new sqlConnection(ConnectionString) ;<br />
sqlCommand cmd = new sqlCommand(strSqlQuery) ;<br />
cmd.Parameters.Add(new sqlParameters("@id",sqlDbType.Int,4,"id"));<br />
cmd.Parameters[0].value = textBox1.Text ;
sqlDataAdapter da = new sqlDataAdapter ;<br />
da.SelectCommand = cmd ;<br />
da.Fill(ds,"Table") ;<br />
dgParts.DataSource = ds.Tables[0].TableName ;<br />
dgParts.Refresh() ;<br />
Contact me for any problem...
|
|
|
|
|
I did a brief search herein, but found nothing.
I'd like to see how easy it would be to take advantage of MS Word's spell-check functionality to implement into a simple word processor of my own.
Has someone already done a CP article about that?
If I have to, I'll just make my own simple spell-checker, but I was hoping to be able to borrow Word's...
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
Nevermind, all, I found it!
-Daniel
Typing too fast fro my owngood
|
|
|
|
|
I've just created a paint application using vs 2005 but it seems to be a problem
every time the user draws a shape on the canvas the paint event is triggered and the screen seems to blink every second ... looks very disturbing
I really don't know how to solve this probleme ..
Can anyone help me?
modified 30-Nov-21 21:01pm.
|
|
|
|
|
Go to the constructor of the control where you paint on, ie: a Form or a Panel. Add the lines:
<br />
this.SetStyle( ControlStyles.UserPaint , true );<br />
this.SetStyle( ControlStyles.AllPaintingInWmPaint , true );<br />
this.SetStyle( ControlStyles.DoubleBuffer , true );<br />
These commands make your painting automatically double buffered, wich ommits the flickering.
Greatings,
Djohnnie
|
|
|
|
|
Thanks a lot.
modified 30-Nov-21 21:01pm.
|
|
|
|
|
I have written an application and in the main method i surrounded my Application.Run( new MainForm() ); with a try catch clausule. If I run the project as debug and an exception occurs, a nice dialog appears explaining what went wrong, all data is stored to the disk and if pressed OK, the application closes. If I build a release version of this project the dialog does not appear. Instead I get the standard dialog from the .NET framework telling that there was an exception.
My question is how is it that my code only does what i want when running the debug version from the Visual Studio environment?
Thanx
Djohnnie
<br />
try<br />
{<br />
Application.Run( new MainForm() );<br />
}<br />
catch( Exception e )<br />
{<br />
ExceptionHandlingDialog ehd = new ExceptionHandlingDialog( e );<br />
ehd.ShowDialog();<br />
}<br />
|
|
|
|
|
I've had similar issues, apparently the debug runtime handles exceptions generated across threads (any gui app has a minumum of 2, gui and main) differently than the releasemode runtime. You need to move your exception handler into a method and attach it to the thread exception handler. Leave your try catch in place, you'll still need it to handle any exceptions generated by static classes. Even if your current implementation doesn't have any, since this is obscure and wierd behavior I'd cover it now and document why I had both ways in place.
Application.ThreadException += new ThreadExceptionEventHandler (FatalExceptionHandler);
|
|
|
|
|
You just became my personal superhero!
Your solution does excactly what I want, and is so simple
Thank you very much.
Greatings,
Djohnnie
|
|
|
|
|
Glad to be of help. I was in your shoes a few months ago.
|
|
|
|
|
If I create a default static constuctor.
Can I be guaranteed that this will be called the first time a static property or method is called?
Thanks,
Nick
1 line of code equals many bugs. So don't write any!!
|
|
|
|
|
It will be called the first time the class is loaded, so, basically, the answer to your question is yes.
--------
"I say no to drugs, but they don't listen."
- Marilyn Mansonques
|
|
|
|
|
thanks
1 line of code equals many bugs. So don't write any!!
|
|
|
|
|