I have a richtextbox that its text is a concatenation of开发者_如何学JAVA some words from specific table. (table columns are 'word','translate' and 'id')
I need that when a user hover on each word, the related translate is showed in word's tooltip. (something like google translate but in windows form application.)
Can somebody point me towards a solution?
using Web-browser Control and Injecting JavaScript solved my problem. ;)
This will do the trick...
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
// whitespace definition
char[] whitespace = new char[] { ' ', '\r', '\n', '\t' };
int charPosition = this.richTextBox1.GetCharIndexFromPosition(e.Location);
string fullText = this.richTextBox1.Text;
// if we are on whitespace, exit
if (whitespace.Contains(fullText[charPosition]))
{
return;
}
// find a whitespace towards the start of the text
int firstWhiteSpace = charPosition;
while (firstWhiteSpace > 0
&& firstWhiteSpace < fullText.Length
&& !whitespace.Contains(fullText[firstWhiteSpace]))
{
firstWhiteSpace--;
}
if (firstWhiteSpace!=0)
firstWhiteSpace++;
// find the next whitespace
int lastWhiteSpace = fullText.IndexOfAny(whitespace, charPosition);
if (lastWhiteSpace == -1)
lastWhiteSpace = fullText.Length;
// substring the word out of the flat text
string word = fullText.Substring(
firstWhiteSpace,
lastWhiteSpace - firstWhiteSpace);
// show the result
label1.Text = String.Format("pos:{0} fsp:{1}, lsp:{2}, len:{3}, word:{4}",
charPosition,
firstWhiteSpace,
lastWhiteSpace,
fullText.Length, word);
}
I am not fluent in C#, and I am also brand new to this forum. However, it looks to me like if you were to supplement the code rene posted with a function which queries your Translation table and returns the translation text, you would then have this (forgive my pseudo-code butchery - I am very fluent in vb.net, gonna learn the C# syntax soon):
Private String TranslatedWord(ByVal SelectedWord String)
{
//Use ADO and SQL to retrieve the Translation(s) associated with the submitted Word
// A string SQL Statement (the GROUP ON is in case there are multiple instances of the same word, with different translations (synonyms). THis SQL Should return a a single record for each possible translation of the submitted word (more than one result possible):
Dim SQL as String = _
"SELECT tr.ID, tr.Translate " & _
"FROM MyTranslationTable AS tr " & _
"WHERE tr.Word LIKE @Word"
//Since I could be ALL DAY struggling to write the C# code for this, I will just step through it in "pseudocode":
// 1. Execute the SQL using ADO.Net, set up the @Word Param in your command, and return a sqlDataReader
// 2. Iterate through the returned records, and append the Translation results to a System.Text.Stringbuilder object. Delimit each returned value with a semi-colon (or your delimiter of choice).
// Return the Stringbuilder.ToString property as the result of this function;
}
Then change the last part of rene's code ("//Show the result") as follows (suitable corrected for my horrible C# problem!):
private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
// whitespace definition
char[] whitespace = new char[] { ' ', '\r', '\n', '\t' };
int charPosition = this.richTextBox1.GetCharIndexFromPosition(e.Location);
string fullText = this.richTextBox1.Text;
// if we are on whitespace, exit
if (whitespace.Contains(fullText[charPosition]))
{
return;
}
// find a whitespace towards the start of the text
int firstWhiteSpace = charPosition;
while (firstWhiteSpace > 0
&& firstWhiteSpace < fullText.Length
&& !whitespace.Contains(fullText[firstWhiteSpace]))
{
firstWhiteSpace--;
}
if (firstWhiteSpace!=0)
firstWhiteSpace++;
// find the next whitespace
int lastWhiteSpace = fullText.IndexOfAny(whitespace, charPosition);
if (lastWhiteSpace == -1)
lastWhiteSpace = fullText.Length;
// substring the word out of the flat text
string word = fullText.Substring(
firstWhiteSpace,
lastWhiteSpace - firstWhiteSpace);
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//My CHanges start here, and will likely require
// some tweaking . . .
//Use the function I have poorly described above to retreive the
//translation(s) for the current Word:
string TRANSLATION = TranslatedWord(word);
// show the result
//Since there are so many minor but important differences between C# and VB, I am not going to attempt
//to account for them. Essentially, display the translated word instead of the word over which the mouse is hovering:
label1.Text = String.Format("pos:{0} fsp:{1}, lsp:{2}, len:{3}, word:{4}",
charPosition,
firstWhiteSpace,
lastWhiteSpace,
fullText.Length, TRANSLATION);
}
If it would be helpful, I could bust out the vb.net code for this fairly quickly, but I wasn't going to do that unless it would be helpful.
Hope that's helpful. I am going to have to work a little at learning C#, and at improving my understanding of posting in this forum! Getting the code to look right is proving a challenge . . .
精彩评论