プロが教えるわが家の防犯対策術!

ラベルの文字列の長さが変わったときに、ラベル位置を自動で変更する方法

環境:Visual Studio 2008 (C#)、Windows 7 Professional (x64)

フォーム上にラベルを配置し、AutoSizeをTrue、AnchorをRightに設定すると、ラベルはフォームの右端に位置するように自動で位置を変更してくれます。
しかし、ラベルの内容を今より長い文字列に設定すると、ラベルの内容はフォームの右端をはみ出してしまい、ラベル全体に対してフォームの右端になるように配置してくれません。

いい方法がございましたら、お教えください。
どうぞよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

 こんにちは。

補足頂きました。

 Anchorは初期配置する際に、フォーム上の何処へ置くか、AutoSizeはテキストに合わせてラベルの幅が自動的に伸びる様になる、と言ったところではないでしょうか。
 結局、ラベルの幅が増えても位置は固定のままです。

 ラベルを含め、ボタン等のコントロールの素性はチャイルドスタイルのウィンドウを複合して形成されたものです。
 色々とウィンドウを取り扱ってきましたが、ウィンドウの幅を自動変更してくれるのはありますが、ウィンドウの位置まで自動変更してくれるものは見た事がないです。

 .NetFrameworkには色々と都合の好さそうなプロパティが存在するのですが、設定しても期待した通りにはならない事が良くあります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なかなか意図したようには動作しないのですね。

お礼日時:2010/05/27 09:13

 こんばんは。



 ラベルの右端をフォームの右端に合わせたいと言う事でしょうか。
 ラベルにテキストをセットした時に幅を計測して、フォームの右端からはみ出ていたら、ラベルを左に移動して見ては。
 当方の環境は、VisualStudio2008, windows xp 32bitです。以下参考程度に。

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//デタラメに長い文字列を作成する
String s = "";
for (int n = 0; n < 300; ++n)
s += n.ToString() + ",";

//ラベルにセット
this.label1.Text = s;

//ラベルの幅がフォームからはみ出たかどうかを確認
int X = (this.label1.Width + this.label1.Margin.Right) - this.Width;

//はみ出ていたので左へ移動
if(X > 0)
this.label1.Location = new Point(-X, this.label1.Location.Y);
}

}
}

この回答への補足

回答ありがとうございます。
ということは、Anchorはラベルの初期幅を基準にしていて、ラベルの幅が変わってしまうと、Anchorが設定されていても位置は自動で変わらない、ということなんですかね。

補足日時:2010/05/26 14:38
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC#でほかのファイルにある自作クラスを使用したい場合

最近Javaから移ってきたばかりのC#初心者です。
依然作ったことのあるほかのファイルにある自作クラスを
新しいファイルの自作クラスで使用したい場合、どうすれば
よいのでしょうか。
Form1.cs(8,7): error CS0246: 型または名前空間名 'Calc1' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
Form1.cs(12,19): error CS0246: 型または名前空間名 'Calc' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
上記のようなエラーが発生してしまいます。
なにとぞご助力をお願いいたします。

Aベストアンサー

#2>しかし、やはりうまくいきませんでした。
#1で言われているような、namespace, using 指定と参照設定でうまくいくと思うんですけど・

自作クラスを補足することはできますか?

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?

QLabelコントロールに数字を代入する

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
LabelにInt型の変数の中身を代入する方法がわかりません。
ソースコードで書くと
int a = 10;
label1.Text = a;//こうするとInt型をString型に変換できませんと
        //で る
参考書などには数字を表示したいならTextBoxを使いなさいとよく書かれているのですが、今のプログラムはユーザーに数字の表示を変えられるといけないので、悩んでいます。
どなたかLabelにInt型を入れる方法か、ユーザーがコントロールできないようなLabelに代わるものを教えていただけないでしょうか><
よろしくお願いします。

Aベストアンサー

int→stringはToStringメソッドでできます。

label1.Text = a.ToString();

(参考)逆はint.Parseメソッド(かint.TryParse)またはConvert.ToInt32あたりでできます。

QC#でのWNetAddConnection3の使い方を教えてください

現在、C#(VisualStudio2005)で共有フォルダの認証を行い、
そのフォルダ内のファイルを読み込む処理を行ないたいと考えています。

■動作------------------------------------------------------
1.ボタン押下によってフォルダ(\\aaa)をユーザ(user)、パスワード(pass)で認証を行なう
2.ファイル(bbb.txt)の内容をメッセージボックスに出力する
3.認証を切る

■現在の実装状況--------------------------------------------
private void btnGetShareFileData_Click(object sender, EventArgs e)
{
NETRESOURCE netresource = new NETRESOURCE();
netresource.dwType = 1;
netresource.lpLocalName = null;
netresource.lpRemoteName = "\\\\aaa";
netresource.lpProvider = null;
try
{
int returnNo1 = WNetAddConnection3(IntPtr.Zero, ref netresource, "user", "pass", 0);
System.IO.StreamReader streamReader =
new System.IO.StreamReader("\\\\aaa\\bbb.txt", System.Text.Encoding.GetEncoding(932));
MessageBox.Show(streamReader.ReadToEnd());
int returnNo2 = WNetCancelConnection2("\\\\aaa", "0", true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct NETRESOURCE
{
public int dwType;
public string lpLocalName;
public string lpRemoteName;
public string lpProvider;
}

[DllImport("mpr.dll")]
private static extern int WNetAddConnection3(
System.IntPtr hWndOwner,
ref NETRESOURCE lpNetResource,
string lpPassword,
string lpUserName,
int dwFlags
);
[DllImport("mpr.dll")]
private static extern int WNetCancelConnection2(
string lpName,
string dwFlags,
bool fForce
);
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(
ref NETRESOURCE lpNetResource,
string lpPassword,
string lpUsername,
int dwFlags
);


■結果------------------------------------------------------
WNetAddConnection3の戻り値が「487」で
System.IO.StreamReader streamReaderを実行されると
「ログオン失敗:ユーザ名を認識できないかまたはパスワードが間違っています。」
とエラーになってします。

WNetAddConnection3でのログオン自体がうまくできていないのでしょうですが、
どうすればよいのかがわかりません。
(ちなみにWNetAddConnection2でやってみても同様です)

どなたか教えていただけないでしょうか?
いろいろなページは参考にさせていただいているのですが、
知識が足らず読み解くことができないので、
できればサンプルコード等を教えていただけると助かります。

よろしくお願いいたします。

現在、C#(VisualStudio2005)で共有フォルダの認証を行い、
そのフォルダ内のファイルを読み込む処理を行ないたいと考えています。

■動作------------------------------------------------------
1.ボタン押下によってフォルダ(\\aaa)をユーザ(user)、パスワード(pass)で認証を行なう
2.ファイル(bbb.txt)の内容をメッセージボックスに出力する
3.認証を切る

■現在の実装状況--------------------------------------------
private void btnGetShareFileData_Click(object sender, Eve...続きを読む

Aベストアンサー

NETRESOURCE構造体の定義が違うからでしょう
メンバーが足りないのです

public struct NETRESOURCE
{
  public int dwScope;     // Added
  public int dwType;
  public int dwDisplayType;  // Added
  public int dwUsage;     // Added
  public string lpLocalName;
  public string lpRemoteName;
  public string lpComment;  // Added
  public string lpProvider;
}
メンバーが足りないためにAPIの中で違う場所を参照してしまうため共有資源の名前が受け取れていないのです
VS2005付属のMSDNなどで NETRESOUSE構造体を確認しましょう
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/wnet/wnet/netresource_str.htm

NETRESOURCE構造体の定義が違うからでしょう
メンバーが足りないのです

public struct NETRESOURCE
{
  public int dwScope;     // Added
  public int dwType;
  public int dwDisplayType;  // Added
  public int dwUsage;     // Added
  public string lpLocalName;
  public string lpRemoteName;
  public string lpComment;  // Added
  public string lpProvider;
}
メンバーが足りないためにAPIの中で違う場所を参照してしまうため共有資源の名前が受け...続きを読む

Qコンボボックス内のアイテムを選択してラベルを表示させるには?

プログラミング初心者です。よろしくお願いします。
開発環境:XP HOME SP3
使用言語:VisualC#
使用ソフト:Visual Studio 2008 Professional

コンボボックス内のアイテム選択すると、ラベルが最前面に表示させられるようにするにはどうすればいいでしょうか?

コンボボックスはDropDownListにしています。

Aベストアンサー

 こんにちは。
 コンボボックスを選択した時に、見えないラベルコントロールを表示をすると言う事でしょうか。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cbx = (ComboBox)sender;

//コンボボックスの2番目が選択された時
if (cbx.SelectedIndex == 1)
{
//前面に持ってくる
this.label1.BringToFront();

//表示する
this.label1.Visible = true;
}
}

QC言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。
一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと
思います。

<test.c>

int main()
{
/* ---------------------------------------- */
/* 構造体のメンバ(NULL保障無し)がNULLか */
/* 比較するサンプル */
/* ---------------------------------------- */

char buf[50];
/* サンプル構造体 */
struct ST_test {
int cd;
char name[10];
int no;
};

struct ST_test st_test; /* 構造体定義 */
memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */
memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */

/* 構造体に値セット */
st_test.cd = 12;
memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name));
st_test.no = 999;

/* NULL判定 */
if(*st_test.name == 0x00)
{
printf("NULLです\n");
}
else
{
printf("NULLではないです\n");
}

return (0);

}

C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。
一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと
思います。

<test.c>

int main()
{
/* ---------------------------------------- */
/* 構造体のメンバ(NULL保障無し)がNULLか */
/* 比較するサンプル */
/* ---------------------------------------- */

char buf[50];
/* サンプル構造体 */
struct ST_test {
int cd;
...続きを読む

Aベストアンサー

1)先頭が'\0'でない文字列をmemcpy()したのだから、*st_test.nameは'\0'でないのに
  決まっている。そもそも'\0'との一致判定をすることに意味があるのかどうか。
2)標準関数のプロトタイプ宣言を行なっているヘッダーファイルをインクルードしていない。
3)&buf[0]はbufと省略できる点を理解しているかどうか。
4)memcpy()で、文字列終端を含めて11バイトのデータを10バイトの領域にコピーしている。
  プログラムの仕様として正しいかどうか。
5)#1さんの回答のとおり、NULLと'\0'との違いをじゅうぶん理解できているかどうか。


人気Q&Aランキング